yepanywhere 0.5.2 → 0.6.0

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 (858) hide show
  1. package/README.md +21 -5
  2. package/bundled/@yep-anywhere/shared/dist/agent-context.d.ts +9 -0
  3. package/bundled/@yep-anywhere/shared/dist/agent-context.d.ts.map +1 -0
  4. package/bundled/@yep-anywhere/shared/dist/agent-context.js +18 -0
  5. package/bundled/@yep-anywhere/shared/dist/agent-context.js.map +1 -0
  6. package/bundled/@yep-anywhere/shared/dist/app-types.d.ts +104 -1
  7. package/bundled/@yep-anywhere/shared/dist/app-types.d.ts.map +1 -1
  8. package/bundled/@yep-anywhere/shared/dist/app-types.js +4 -0
  9. package/bundled/@yep-anywhere/shared/dist/app-types.js.map +1 -1
  10. package/bundled/@yep-anywhere/shared/dist/binary-framing.d.ts +4 -1
  11. package/bundled/@yep-anywhere/shared/dist/binary-framing.d.ts.map +1 -1
  12. package/bundled/@yep-anywhere/shared/dist/binary-framing.js +8 -3
  13. package/bundled/@yep-anywhere/shared/dist/binary-framing.js.map +1 -1
  14. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/AssistantEntrySchema.d.ts +4 -0
  15. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/AssistantEntrySchema.d.ts.map +1 -1
  16. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/BaseEntrySchema.d.ts +4 -0
  17. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/BaseEntrySchema.d.ts.map +1 -1
  18. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/BaseEntrySchema.js +7 -0
  19. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/BaseEntrySchema.js.map +1 -1
  20. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/ProgressEntrySchema.d.ts +4 -0
  21. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/ProgressEntrySchema.d.ts.map +1 -1
  22. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/SystemEntrySchema.d.ts +64 -1
  23. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/SystemEntrySchema.d.ts.map +1 -1
  24. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/SystemEntrySchema.js +9 -0
  25. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/SystemEntrySchema.js.map +1 -1
  26. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/UserEntrySchema.d.ts +4 -0
  27. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/entry/UserEntrySchema.d.ts.map +1 -1
  28. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/guards.d.ts.map +1 -1
  29. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/guards.js +45 -1
  30. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/guards.js.map +1 -1
  31. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/index.d.ts +144 -2
  32. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/index.d.ts.map +1 -1
  33. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/tool/ToolResultSchemas.d.ts +6 -4
  34. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/tool/ToolResultSchemas.d.ts.map +1 -1
  35. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/tool/ToolResultSchemas.js +8 -1
  36. package/bundled/@yep-anywhere/shared/dist/claude-sdk-schema/tool/ToolResultSchemas.js.map +1 -1
  37. package/bundled/@yep-anywhere/shared/dist/codex-schema/index.d.ts +3 -2
  38. package/bundled/@yep-anywhere/shared/dist/codex-schema/index.d.ts.map +1 -1
  39. package/bundled/@yep-anywhere/shared/dist/codex-schema/index.js +3 -2
  40. package/bundled/@yep-anywhere/shared/dist/codex-schema/index.js.map +1 -1
  41. package/bundled/@yep-anywhere/shared/dist/codex-schema/session.d.ts +87 -3
  42. package/bundled/@yep-anywhere/shared/dist/codex-schema/session.d.ts.map +1 -1
  43. package/bundled/@yep-anywhere/shared/dist/codex-schema/session.js +39 -1
  44. package/bundled/@yep-anywhere/shared/dist/codex-schema/session.js.map +1 -1
  45. package/bundled/@yep-anywhere/shared/dist/dag.d.ts +31 -11
  46. package/bundled/@yep-anywhere/shared/dist/dag.d.ts.map +1 -1
  47. package/bundled/@yep-anywhere/shared/dist/dag.js +77 -33
  48. package/bundled/@yep-anywhere/shared/dist/dag.js.map +1 -1
  49. package/bundled/@yep-anywhere/shared/dist/git-status.d.ts +70 -1
  50. package/bundled/@yep-anywhere/shared/dist/git-status.d.ts.map +1 -1
  51. package/bundled/@yep-anywhere/shared/dist/git-status.js +6 -1
  52. package/bundled/@yep-anywhere/shared/dist/git-status.js.map +1 -1
  53. package/bundled/@yep-anywhere/shared/dist/ideMetadata.js +1 -1
  54. package/bundled/@yep-anywhere/shared/dist/ideMetadata.js.map +1 -1
  55. package/bundled/@yep-anywhere/shared/dist/index.d.ts +20 -11
  56. package/bundled/@yep-anywhere/shared/dist/index.d.ts.map +1 -1
  57. package/bundled/@yep-anywhere/shared/dist/index.js +8 -3
  58. package/bundled/@yep-anywhere/shared/dist/index.js.map +1 -1
  59. package/bundled/@yep-anywhere/shared/dist/local-resource.d.ts +1 -0
  60. package/bundled/@yep-anywhere/shared/dist/local-resource.d.ts.map +1 -1
  61. package/bundled/@yep-anywhere/shared/dist/local-resource.js +4 -0
  62. package/bundled/@yep-anywhere/shared/dist/local-resource.js.map +1 -1
  63. package/bundled/@yep-anywhere/shared/dist/opencode-schema/events.d.ts +136 -0
  64. package/bundled/@yep-anywhere/shared/dist/opencode-schema/events.d.ts.map +1 -1
  65. package/bundled/@yep-anywhere/shared/dist/opencode-schema/events.js +65 -3
  66. package/bundled/@yep-anywhere/shared/dist/opencode-schema/events.js.map +1 -1
  67. package/bundled/@yep-anywhere/shared/dist/opencode-schema/types.d.ts +1 -1
  68. package/bundled/@yep-anywhere/shared/dist/opencode-schema/types.d.ts.map +1 -1
  69. package/bundled/@yep-anywhere/shared/dist/project-queue.d.ts +153 -0
  70. package/bundled/@yep-anywhere/shared/dist/project-queue.d.ts.map +1 -0
  71. package/bundled/@yep-anywhere/shared/dist/project-queue.js +8 -0
  72. package/bundled/@yep-anywhere/shared/dist/project-queue.js.map +1 -0
  73. package/bundled/@yep-anywhere/shared/dist/relay-protocol.d.ts +26 -2
  74. package/bundled/@yep-anywhere/shared/dist/relay-protocol.d.ts.map +1 -1
  75. package/bundled/@yep-anywhere/shared/dist/relay-protocol.js +33 -0
  76. package/bundled/@yep-anywhere/shared/dist/relay-protocol.js.map +1 -1
  77. package/bundled/@yep-anywhere/shared/dist/relay.d.ts +45 -5
  78. package/bundled/@yep-anywhere/shared/dist/relay.d.ts.map +1 -1
  79. package/bundled/@yep-anywhere/shared/dist/relay.js.map +1 -1
  80. package/bundled/@yep-anywhere/shared/dist/safe-restart.d.ts +25 -0
  81. package/bundled/@yep-anywhere/shared/dist/safe-restart.d.ts.map +1 -0
  82. package/bundled/@yep-anywhere/shared/dist/safe-restart.js +2 -0
  83. package/bundled/@yep-anywhere/shared/dist/safe-restart.js.map +1 -0
  84. package/bundled/@yep-anywhere/shared/dist/session/SessionView.d.ts +2 -2
  85. package/bundled/@yep-anywhere/shared/dist/session/SessionView.js +3 -3
  86. package/bundled/@yep-anywhere/shared/dist/session/SessionView.js.map +1 -1
  87. package/bundled/@yep-anywhere/shared/dist/session/UnifiedSession.d.ts +10 -0
  88. package/bundled/@yep-anywhere/shared/dist/session/UnifiedSession.d.ts.map +1 -1
  89. package/bundled/@yep-anywhere/shared/dist/session-liveness.d.ts +18 -0
  90. package/bundled/@yep-anywhere/shared/dist/session-liveness.d.ts.map +1 -1
  91. package/bundled/@yep-anywhere/shared/dist/types.d.ts +253 -8
  92. package/bundled/@yep-anywhere/shared/dist/types.d.ts.map +1 -1
  93. package/bundled/@yep-anywhere/shared/dist/types.js +48 -5
  94. package/bundled/@yep-anywhere/shared/dist/types.js.map +1 -1
  95. package/bundled/@yep-anywhere/shared/dist/upload.d.ts +34 -2
  96. package/bundled/@yep-anywhere/shared/dist/upload.d.ts.map +1 -1
  97. package/bundled/@yep-anywhere/shared/dist/user-message-metadata.d.ts +47 -0
  98. package/bundled/@yep-anywhere/shared/dist/user-message-metadata.d.ts.map +1 -1
  99. package/bundled/@yep-anywhere/shared/dist/user-message-metadata.js +59 -1
  100. package/bundled/@yep-anywhere/shared/dist/user-message-metadata.js.map +1 -1
  101. package/bundled/@yep-anywhere/shared/dist/workstreams.d.ts +54 -0
  102. package/bundled/@yep-anywhere/shared/dist/workstreams.d.ts.map +1 -0
  103. package/bundled/@yep-anywhere/shared/dist/workstreams.js +8 -0
  104. package/bundled/@yep-anywhere/shared/dist/workstreams.js.map +1 -0
  105. package/bundled/@yep-anywhere/shared/package.json +1 -1
  106. package/client-dist/assets/alegreya-sans-latin-400-italic-BQIUBrX-.woff2 +0 -0
  107. package/client-dist/assets/alegreya-sans-latin-400-normal-BxeZdXas.woff2 +0 -0
  108. package/client-dist/assets/alegreya-sans-latin-500-normal-uodOEoAl.woff2 +0 -0
  109. package/client-dist/assets/alegreya-sans-latin-700-normal-DFYOGfC8.woff2 +0 -0
  110. package/client-dist/assets/de-CHMDbVD5.js +6 -0
  111. package/client-dist/assets/es-CK8MPF_C.js +6 -0
  112. package/client-dist/assets/fira-mono-latin-400-normal-DVTTRLHv.woff2 +0 -0
  113. package/client-dist/assets/fira-mono-latin-ext-400-normal-B2gPvaNr.woff2 +0 -0
  114. package/client-dist/assets/fira-mono-symbols2-400-normal-C6JptOil.woff2 +0 -0
  115. package/client-dist/assets/fr-49PXQiUL.js +6 -0
  116. package/client-dist/assets/index-B-09fVut.js +557 -0
  117. package/client-dist/assets/index-uJnfvD1f.css +1 -0
  118. package/client-dist/assets/inter-latin-400-italic-D1l0FflY.woff2 +0 -0
  119. package/client-dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  120. package/client-dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  121. package/client-dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  122. package/client-dist/assets/ja-CrCGPmoH.js +6 -0
  123. package/client-dist/assets/zh-CN-AFJxv5ke.js +6 -0
  124. package/client-dist/index.html +3 -3
  125. package/client-dist/sw.js +96 -9
  126. package/dist/app.d.ts +25 -0
  127. package/dist/app.d.ts.map +1 -1
  128. package/dist/app.js +350 -35
  129. package/dist/app.js.map +1 -1
  130. package/dist/augments/augment-generator.d.ts +1 -1
  131. package/dist/augments/augment-generator.d.ts.map +1 -1
  132. package/dist/augments/augment-generator.js +2 -2
  133. package/dist/augments/augment-generator.js.map +1 -1
  134. package/dist/augments/markdown-augments.d.ts +1 -1
  135. package/dist/augments/markdown-augments.d.ts.map +1 -1
  136. package/dist/augments/markdown-augments.js +5 -5
  137. package/dist/augments/markdown-augments.js.map +1 -1
  138. package/dist/augments/safe-markdown.d.ts +10 -0
  139. package/dist/augments/safe-markdown.d.ts.map +1 -1
  140. package/dist/augments/safe-markdown.js +146 -3
  141. package/dist/augments/safe-markdown.js.map +1 -1
  142. package/dist/augments/stream-augmenter.d.ts +3 -0
  143. package/dist/augments/stream-augmenter.d.ts.map +1 -1
  144. package/dist/augments/stream-augmenter.js +6 -3
  145. package/dist/augments/stream-augmenter.js.map +1 -1
  146. package/dist/augments/stream-coordinator.d.ts +5 -1
  147. package/dist/augments/stream-coordinator.d.ts.map +1 -1
  148. package/dist/augments/stream-coordinator.js +6 -4
  149. package/dist/augments/stream-coordinator.js.map +1 -1
  150. package/dist/augments/task-list-augments.d.ts +27 -0
  151. package/dist/augments/task-list-augments.d.ts.map +1 -0
  152. package/dist/augments/task-list-augments.js +360 -0
  153. package/dist/augments/task-list-augments.js.map +1 -0
  154. package/dist/cli.d.ts +1 -17
  155. package/dist/cli.d.ts.map +1 -1
  156. package/dist/cli.js +22 -8
  157. package/dist/cli.js.map +1 -1
  158. package/dist/codex/correlationDebugLogger.d.ts.map +1 -1
  159. package/dist/codex/correlationDebugLogger.js +36 -8
  160. package/dist/codex/correlationDebugLogger.js.map +1 -1
  161. package/dist/codex/normalization.d.ts +1 -0
  162. package/dist/codex/normalization.d.ts.map +1 -1
  163. package/dist/codex/normalization.js +262 -7
  164. package/dist/codex/normalization.js.map +1 -1
  165. package/dist/config.d.ts +49 -6
  166. package/dist/config.d.ts.map +1 -1
  167. package/dist/config.js +55 -14
  168. package/dist/config.js.map +1 -1
  169. package/dist/defaults.d.ts +3 -0
  170. package/dist/defaults.d.ts.map +1 -0
  171. package/dist/defaults.js +3 -0
  172. package/dist/defaults.js.map +1 -0
  173. package/dist/device/DeviceBridgeService.js +1 -1
  174. package/dist/device/DeviceBridgeService.js.map +1 -1
  175. package/dist/envSettings.d.ts +64 -0
  176. package/dist/envSettings.d.ts.map +1 -0
  177. package/dist/envSettings.js +553 -0
  178. package/dist/envSettings.js.map +1 -0
  179. package/dist/frontend/static.d.ts.map +1 -1
  180. package/dist/frontend/static.js +3 -1
  181. package/dist/frontend/static.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +190 -14
  185. package/dist/index.js.map +1 -1
  186. package/dist/indexes/SessionDiscoveryIndex.d.ts +78 -0
  187. package/dist/indexes/SessionDiscoveryIndex.d.ts.map +1 -0
  188. package/dist/indexes/SessionDiscoveryIndex.js +223 -0
  189. package/dist/indexes/SessionDiscoveryIndex.js.map +1 -0
  190. package/dist/indexes/SessionIndexService.d.ts +114 -1
  191. package/dist/indexes/SessionIndexService.d.ts.map +1 -1
  192. package/dist/indexes/SessionIndexService.js +875 -105
  193. package/dist/indexes/SessionIndexService.js.map +1 -1
  194. package/dist/indexes/index.d.ts +2 -1
  195. package/dist/indexes/index.d.ts.map +1 -1
  196. package/dist/indexes/index.js +1 -0
  197. package/dist/indexes/index.js.map +1 -1
  198. package/dist/indexes/types.d.ts +26 -0
  199. package/dist/indexes/types.d.ts.map +1 -1
  200. package/dist/logging/logger.d.ts.map +1 -1
  201. package/dist/logging/logger.js +2 -3
  202. package/dist/logging/logger.js.map +1 -1
  203. package/dist/maintenance/server.d.ts.map +1 -1
  204. package/dist/maintenance/server.js +8 -11
  205. package/dist/maintenance/server.js.map +1 -1
  206. package/dist/metadata/ProjectMetadataService.d.ts +7 -0
  207. package/dist/metadata/ProjectMetadataService.d.ts.map +1 -1
  208. package/dist/metadata/ProjectMetadataService.js +63 -19
  209. package/dist/metadata/ProjectMetadataService.js.map +1 -1
  210. package/dist/metadata/SessionMetadataService.d.ts +82 -3
  211. package/dist/metadata/SessionMetadataService.d.ts.map +1 -1
  212. package/dist/metadata/SessionMetadataService.js +233 -17
  213. package/dist/metadata/SessionMetadataService.js.map +1 -1
  214. package/dist/middleware/file-access.d.ts +66 -0
  215. package/dist/middleware/file-access.d.ts.map +1 -0
  216. package/dist/middleware/file-access.js +112 -0
  217. package/dist/middleware/file-access.js.map +1 -0
  218. package/dist/projects/codex-scanner.d.ts +28 -1
  219. package/dist/projects/codex-scanner.d.ts.map +1 -1
  220. package/dist/projects/codex-scanner.js +149 -39
  221. package/dist/projects/codex-scanner.js.map +1 -1
  222. package/dist/projects/gemini-scanner.d.ts.map +1 -1
  223. package/dist/projects/gemini-scanner.js +59 -6
  224. package/dist/projects/gemini-scanner.js.map +1 -1
  225. package/dist/projects/paths.d.ts +15 -1
  226. package/dist/projects/paths.d.ts.map +1 -1
  227. package/dist/projects/paths.js +69 -23
  228. package/dist/projects/paths.js.map +1 -1
  229. package/dist/projects/scanner.d.ts +5 -0
  230. package/dist/projects/scanner.d.ts.map +1 -1
  231. package/dist/projects/scanner.js +136 -28
  232. package/dist/projects/scanner.js.map +1 -1
  233. package/dist/push/InactivityPushNotifier.d.ts +61 -0
  234. package/dist/push/InactivityPushNotifier.d.ts.map +1 -0
  235. package/dist/push/InactivityPushNotifier.js +305 -0
  236. package/dist/push/InactivityPushNotifier.js.map +1 -0
  237. package/dist/push/PushNotifier.d.ts.map +1 -1
  238. package/dist/push/PushNotifier.js.map +1 -1
  239. package/dist/push/PushService.d.ts +7 -4
  240. package/dist/push/PushService.d.ts.map +1 -1
  241. package/dist/push/PushService.js +27 -7
  242. package/dist/push/PushService.js.map +1 -1
  243. package/dist/push/index.d.ts +2 -1
  244. package/dist/push/index.d.ts.map +1 -1
  245. package/dist/push/index.js +1 -0
  246. package/dist/push/index.js.map +1 -1
  247. package/dist/push/routes.d.ts.map +1 -1
  248. package/dist/push/routes.js +28 -1
  249. package/dist/push/routes.js.map +1 -1
  250. package/dist/push/types.d.ts +21 -3
  251. package/dist/push/types.d.ts.map +1 -1
  252. package/dist/push/types.js +2 -0
  253. package/dist/push/types.js.map +1 -1
  254. package/dist/routes/dev.d.ts +2 -0
  255. package/dist/routes/dev.d.ts.map +1 -1
  256. package/dist/routes/dev.js +25 -0
  257. package/dist/routes/dev.js.map +1 -1
  258. package/dist/routes/env-settings.d.ts +20 -0
  259. package/dist/routes/env-settings.d.ts.map +1 -0
  260. package/dist/routes/env-settings.js +25 -0
  261. package/dist/routes/env-settings.js.map +1 -0
  262. package/dist/routes/files.d.ts +9 -0
  263. package/dist/routes/files.d.ts.map +1 -1
  264. package/dist/routes/files.js +98 -10
  265. package/dist/routes/files.js.map +1 -1
  266. package/dist/routes/git-status.d.ts.map +1 -1
  267. package/dist/routes/git-status.js +621 -23
  268. package/dist/routes/git-status.js.map +1 -1
  269. package/dist/routes/global-sessions.d.ts +11 -1
  270. package/dist/routes/global-sessions.d.ts.map +1 -1
  271. package/dist/routes/global-sessions.js +53 -33
  272. package/dist/routes/global-sessions.js.map +1 -1
  273. package/dist/routes/inbox.d.ts +10 -1
  274. package/dist/routes/inbox.d.ts.map +1 -1
  275. package/dist/routes/inbox.js +30 -3
  276. package/dist/routes/inbox.js.map +1 -1
  277. package/dist/routes/local-file.d.ts +6 -2
  278. package/dist/routes/local-file.d.ts.map +1 -1
  279. package/dist/routes/local-file.js +13 -4
  280. package/dist/routes/local-file.js.map +1 -1
  281. package/dist/routes/local-image.d.ts +2 -1
  282. package/dist/routes/local-image.d.ts.map +1 -1
  283. package/dist/routes/local-image.js.map +1 -1
  284. package/dist/routes/local-resource-policy.d.ts +7 -1
  285. package/dist/routes/local-resource-policy.d.ts.map +1 -1
  286. package/dist/routes/local-resource-policy.js +0 -0
  287. package/dist/routes/local-resource-policy.js.map +1 -1
  288. package/dist/routes/processes.d.ts.map +1 -1
  289. package/dist/routes/processes.js +49 -11
  290. package/dist/routes/processes.js.map +1 -1
  291. package/dist/routes/project-queue-response.d.ts +26 -0
  292. package/dist/routes/project-queue-response.d.ts.map +1 -0
  293. package/dist/routes/project-queue-response.js +188 -0
  294. package/dist/routes/project-queue-response.js.map +1 -0
  295. package/dist/routes/project-queue.d.ts +5 -0
  296. package/dist/routes/project-queue.d.ts.map +1 -0
  297. package/dist/routes/project-queue.js +219 -0
  298. package/dist/routes/project-queue.js.map +1 -0
  299. package/dist/routes/projects.d.ts +6 -0
  300. package/dist/routes/projects.d.ts.map +1 -1
  301. package/dist/routes/projects.js +116 -28
  302. package/dist/routes/projects.js.map +1 -1
  303. package/dist/routes/providers.d.ts +5 -0
  304. package/dist/routes/providers.d.ts.map +1 -1
  305. package/dist/routes/providers.js +52 -33
  306. package/dist/routes/providers.js.map +1 -1
  307. package/dist/routes/public-shares.d.ts.map +1 -1
  308. package/dist/routes/public-shares.js +46 -17
  309. package/dist/routes/public-shares.js.map +1 -1
  310. package/dist/routes/recents.d.ts +3 -0
  311. package/dist/routes/recents.d.ts.map +1 -1
  312. package/dist/routes/recents.js +3 -1
  313. package/dist/routes/recents.js.map +1 -1
  314. package/dist/routes/server-admin.d.ts +9 -0
  315. package/dist/routes/server-admin.d.ts.map +1 -1
  316. package/dist/routes/server-admin.js +45 -7
  317. package/dist/routes/server-admin.js.map +1 -1
  318. package/dist/routes/session-claude-resume-guard.d.ts +16 -0
  319. package/dist/routes/session-claude-resume-guard.d.ts.map +1 -0
  320. package/dist/routes/session-claude-resume-guard.js +50 -0
  321. package/dist/routes/session-claude-resume-guard.js.map +1 -0
  322. package/dist/routes/session-compact-thresholds.d.ts +22 -0
  323. package/dist/routes/session-compact-thresholds.d.ts.map +1 -0
  324. package/dist/routes/session-compact-thresholds.js +35 -0
  325. package/dist/routes/session-compact-thresholds.js.map +1 -0
  326. package/dist/routes/session-index.d.ts +7 -0
  327. package/dist/routes/session-index.d.ts.map +1 -0
  328. package/dist/routes/session-index.js +9 -0
  329. package/dist/routes/session-index.js.map +1 -0
  330. package/dist/routes/session-list-options.d.ts +1 -1
  331. package/dist/routes/session-list-options.d.ts.map +1 -1
  332. package/dist/routes/session-list-options.js +1 -1
  333. package/dist/routes/session-list-options.js.map +1 -1
  334. package/dist/routes/session-request-helpers.d.ts +31 -0
  335. package/dist/routes/session-request-helpers.d.ts.map +1 -0
  336. package/dist/routes/session-request-helpers.js +212 -0
  337. package/dist/routes/session-request-helpers.js.map +1 -0
  338. package/dist/routes/sessions.d.ts +14 -1
  339. package/dist/routes/sessions.d.ts.map +1 -1
  340. package/dist/routes/sessions.js +2141 -551
  341. package/dist/routes/sessions.js.map +1 -1
  342. package/dist/routes/settings.d.ts +7 -1
  343. package/dist/routes/settings.d.ts.map +1 -1
  344. package/dist/routes/settings.js +771 -25
  345. package/dist/routes/settings.js.map +1 -1
  346. package/dist/routes/speech.d.ts +24 -2
  347. package/dist/routes/speech.d.ts.map +1 -1
  348. package/dist/routes/speech.js +539 -10
  349. package/dist/routes/speech.js.map +1 -1
  350. package/dist/routes/supervisor-queue.d.ts +6 -0
  351. package/dist/routes/supervisor-queue.d.ts.map +1 -0
  352. package/dist/routes/supervisor-queue.js +35 -0
  353. package/dist/routes/supervisor-queue.js.map +1 -0
  354. package/dist/routes/upload.d.ts +2 -0
  355. package/dist/routes/upload.d.ts.map +1 -1
  356. package/dist/routes/upload.js +190 -38
  357. package/dist/routes/upload.js.map +1 -1
  358. package/dist/routes/version.d.ts +18 -1
  359. package/dist/routes/version.d.ts.map +1 -1
  360. package/dist/routes/version.js +22 -1
  361. package/dist/routes/version.js.map +1 -1
  362. package/dist/routes/workstreams.d.ts +11 -0
  363. package/dist/routes/workstreams.d.ts.map +1 -0
  364. package/dist/routes/workstreams.js +144 -0
  365. package/dist/routes/workstreams.js.map +1 -0
  366. package/dist/routes/ws-message-router.d.ts +10 -1
  367. package/dist/routes/ws-message-router.d.ts.map +1 -1
  368. package/dist/routes/ws-message-router.js +43 -4
  369. package/dist/routes/ws-message-router.js.map +1 -1
  370. package/dist/routes/ws-relay-handlers.d.ts +27 -5
  371. package/dist/routes/ws-relay-handlers.d.ts.map +1 -1
  372. package/dist/routes/ws-relay-handlers.js +177 -19
  373. package/dist/routes/ws-relay-handlers.js.map +1 -1
  374. package/dist/routes/ws-relay.d.ts +19 -0
  375. package/dist/routes/ws-relay.d.ts.map +1 -1
  376. package/dist/routes/ws-relay.js +21 -7
  377. package/dist/routes/ws-relay.js.map +1 -1
  378. package/dist/sdk/cli-detection.d.ts +1 -1
  379. package/dist/sdk/cli-detection.d.ts.map +1 -1
  380. package/dist/sdk/cli-detection.js +47 -7
  381. package/dist/sdk/cli-detection.js.map +1 -1
  382. package/dist/sdk/messageLogger.d.ts.map +1 -1
  383. package/dist/sdk/messageLogger.js +38 -10
  384. package/dist/sdk/messageLogger.js.map +1 -1
  385. package/dist/sdk/messageQueue.d.ts.map +1 -1
  386. package/dist/sdk/messageQueue.js +26 -0
  387. package/dist/sdk/messageQueue.js.map +1 -1
  388. package/dist/sdk/providers/__mocks__/grok.d.ts +1 -1
  389. package/dist/sdk/providers/__mocks__/grok.d.ts.map +1 -1
  390. package/dist/sdk/providers/__mocks__/grok.js +1 -1
  391. package/dist/sdk/providers/__mocks__/grok.js.map +1 -1
  392. package/dist/sdk/providers/agentctl-session-env.d.ts +8 -0
  393. package/dist/sdk/providers/agentctl-session-env.d.ts.map +1 -0
  394. package/dist/sdk/providers/agentctl-session-env.js +52 -0
  395. package/dist/sdk/providers/agentctl-session-env.js.map +1 -0
  396. package/dist/sdk/providers/claude-ollama.d.ts +2 -1
  397. package/dist/sdk/providers/claude-ollama.d.ts.map +1 -1
  398. package/dist/sdk/providers/claude-ollama.js +1 -0
  399. package/dist/sdk/providers/claude-ollama.js.map +1 -1
  400. package/dist/sdk/providers/claude-retention.d.ts +19 -0
  401. package/dist/sdk/providers/claude-retention.d.ts.map +1 -0
  402. package/dist/sdk/providers/claude-retention.js +169 -0
  403. package/dist/sdk/providers/claude-retention.js.map +1 -0
  404. package/dist/sdk/providers/claude.d.ts +52 -5
  405. package/dist/sdk/providers/claude.d.ts.map +1 -1
  406. package/dist/sdk/providers/claude.js +593 -71
  407. package/dist/sdk/providers/claude.js.map +1 -1
  408. package/dist/sdk/providers/codex-protocol/generated/AgentMessageInputContent.d.ts +8 -0
  409. package/dist/sdk/providers/codex-protocol/generated/AgentMessageInputContent.d.ts.map +1 -0
  410. package/dist/sdk/providers/codex-protocol/generated/AgentMessageInputContent.js +3 -0
  411. package/dist/sdk/providers/codex-protocol/generated/AgentMessageInputContent.js.map +1 -0
  412. package/dist/sdk/providers/codex-protocol/generated/InternalChatMessageMetadataPassthrough.d.ts +10 -0
  413. package/dist/sdk/providers/codex-protocol/generated/InternalChatMessageMetadataPassthrough.d.ts.map +1 -0
  414. package/dist/sdk/providers/codex-protocol/generated/InternalChatMessageMetadataPassthrough.js +3 -0
  415. package/dist/sdk/providers/codex-protocol/generated/InternalChatMessageMetadataPassthrough.js.map +1 -0
  416. package/dist/sdk/providers/codex-protocol/generated/LegacyAppPathString.d.ts +23 -0
  417. package/dist/sdk/providers/codex-protocol/generated/LegacyAppPathString.d.ts.map +1 -0
  418. package/dist/sdk/providers/codex-protocol/generated/LegacyAppPathString.js +3 -0
  419. package/dist/sdk/providers/codex-protocol/generated/LegacyAppPathString.js.map +1 -0
  420. package/dist/sdk/providers/codex-protocol/generated/MultiAgentMode.d.ts +8 -0
  421. package/dist/sdk/providers/codex-protocol/generated/MultiAgentMode.d.ts.map +1 -0
  422. package/dist/sdk/providers/codex-protocol/generated/MultiAgentMode.js +3 -0
  423. package/dist/sdk/providers/codex-protocol/generated/MultiAgentMode.js.map +1 -0
  424. package/dist/sdk/providers/codex-protocol/generated/ReasoningEffort.d.ts +1 -1
  425. package/dist/sdk/providers/codex-protocol/generated/ReasoningEffort.d.ts.map +1 -1
  426. package/dist/sdk/providers/codex-protocol/generated/ResponseItem.d.ts +38 -1
  427. package/dist/sdk/providers/codex-protocol/generated/ResponseItem.d.ts.map +1 -1
  428. package/dist/sdk/providers/codex-protocol/generated/v2/AdditionalFileSystemPermissions.d.ts +3 -3
  429. package/dist/sdk/providers/codex-protocol/generated/v2/AdditionalFileSystemPermissions.d.ts.map +1 -1
  430. package/dist/sdk/providers/codex-protocol/generated/v2/CapabilityRootLocation.d.ts +9 -0
  431. package/dist/sdk/providers/codex-protocol/generated/v2/CapabilityRootLocation.d.ts.map +1 -0
  432. package/dist/sdk/providers/codex-protocol/generated/v2/CapabilityRootLocation.js +3 -0
  433. package/dist/sdk/providers/codex-protocol/generated/v2/CapabilityRootLocation.js.map +1 -0
  434. package/dist/sdk/providers/codex-protocol/generated/v2/CommandExecutionRequestApprovalParams.d.ts +6 -2
  435. package/dist/sdk/providers/codex-protocol/generated/v2/CommandExecutionRequestApprovalParams.d.ts.map +1 -1
  436. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolFunctionSpec.d.ts +8 -0
  437. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolFunctionSpec.d.ts.map +1 -0
  438. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolFunctionSpec.js +3 -0
  439. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolFunctionSpec.js.map +1 -0
  440. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceSpec.d.ts +7 -0
  441. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceSpec.d.ts.map +1 -0
  442. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceSpec.js +3 -0
  443. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceSpec.js.map +1 -0
  444. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceTool.d.ts +5 -0
  445. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceTool.d.ts.map +1 -0
  446. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceTool.js +3 -0
  447. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolNamespaceTool.js.map +1 -0
  448. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolSpec.d.ts +6 -7
  449. package/dist/sdk/providers/codex-protocol/generated/v2/DynamicToolSpec.d.ts.map +1 -1
  450. package/dist/sdk/providers/codex-protocol/generated/v2/FileSystemPath.d.ts +2 -2
  451. package/dist/sdk/providers/codex-protocol/generated/v2/FileSystemPath.d.ts.map +1 -1
  452. package/dist/sdk/providers/codex-protocol/generated/v2/McpToolCallAppContext.d.ts +6 -0
  453. package/dist/sdk/providers/codex-protocol/generated/v2/McpToolCallAppContext.d.ts.map +1 -0
  454. package/dist/sdk/providers/codex-protocol/generated/v2/McpToolCallAppContext.js +3 -0
  455. package/dist/sdk/providers/codex-protocol/generated/v2/McpToolCallAppContext.js.map +1 -0
  456. package/dist/sdk/providers/codex-protocol/generated/v2/PermissionsRequestApprovalParams.d.ts +1 -0
  457. package/dist/sdk/providers/codex-protocol/generated/v2/PermissionsRequestApprovalParams.d.ts.map +1 -1
  458. package/dist/sdk/providers/codex-protocol/generated/v2/SelectedCapabilityRoot.d.ts +15 -0
  459. package/dist/sdk/providers/codex-protocol/generated/v2/SelectedCapabilityRoot.d.ts.map +1 -0
  460. package/dist/sdk/providers/codex-protocol/generated/v2/SelectedCapabilityRoot.js +3 -0
  461. package/dist/sdk/providers/codex-protocol/generated/v2/SelectedCapabilityRoot.js.map +1 -0
  462. package/dist/sdk/providers/codex-protocol/generated/v2/SortDirection.d.ts +2 -0
  463. package/dist/sdk/providers/codex-protocol/generated/v2/SortDirection.d.ts.map +1 -0
  464. package/dist/sdk/providers/codex-protocol/generated/v2/SortDirection.js +3 -0
  465. package/dist/sdk/providers/codex-protocol/generated/v2/SortDirection.js.map +1 -0
  466. package/dist/sdk/providers/codex-protocol/generated/v2/SubAgentActivityKind.d.ts +2 -0
  467. package/dist/sdk/providers/codex-protocol/generated/v2/SubAgentActivityKind.d.ts.map +1 -0
  468. package/dist/sdk/providers/codex-protocol/generated/v2/SubAgentActivityKind.js +3 -0
  469. package/dist/sdk/providers/codex-protocol/generated/v2/SubAgentActivityKind.js.map +1 -0
  470. package/dist/sdk/providers/codex-protocol/generated/v2/Thread.d.ts +8 -0
  471. package/dist/sdk/providers/codex-protocol/generated/v2/Thread.d.ts.map +1 -1
  472. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartParams.d.ts +4 -0
  473. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartParams.d.ts.map +1 -0
  474. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartParams.js +3 -0
  475. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartParams.js.map +1 -0
  476. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartResponse.d.ts +2 -0
  477. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartResponse.d.ts.map +1 -0
  478. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartResponse.js +3 -0
  479. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadCompactStartResponse.js.map +1 -0
  480. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkParams.d.ts +64 -0
  481. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkParams.d.ts.map +1 -0
  482. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkParams.js +3 -0
  483. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkParams.js.map +1 -0
  484. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkResponse.d.ts +46 -0
  485. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkResponse.d.ts.map +1 -0
  486. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkResponse.js +3 -0
  487. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadForkResponse.js.map +1 -0
  488. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadItem.d.ts +19 -1
  489. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadItem.d.ts.map +1 -1
  490. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadReadResponse.d.ts +5 -0
  491. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadReadResponse.d.ts.map +1 -0
  492. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadReadResponse.js +3 -0
  493. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadReadResponse.js.map +1 -0
  494. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeInitialTurnsPageParams.d.ts +17 -0
  495. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeInitialTurnsPageParams.d.ts.map +1 -0
  496. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeInitialTurnsPageParams.js +3 -0
  497. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeInitialTurnsPageParams.js.map +1 -0
  498. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeParams.d.ts +7 -7
  499. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeParams.d.ts.map +1 -1
  500. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeResponse.d.ts +13 -2
  501. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadResumeResponse.d.ts.map +1 -1
  502. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackParams.d.ts +11 -0
  503. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackParams.d.ts.map +1 -0
  504. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackParams.js +3 -0
  505. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackParams.js.map +1 -0
  506. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackResponse.d.ts +12 -0
  507. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackResponse.d.ts.map +1 -0
  508. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackResponse.js +3 -0
  509. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadRollbackResponse.js.map +1 -0
  510. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadSource.d.ts +1 -1
  511. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadSource.d.ts.map +1 -1
  512. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadStartParams.d.ts +13 -9
  513. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadStartParams.d.ts.map +1 -1
  514. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadStartResponse.d.ts +8 -2
  515. package/dist/sdk/providers/codex-protocol/generated/v2/ThreadStartResponse.d.ts.map +1 -1
  516. package/dist/sdk/providers/codex-protocol/generated/v2/ToolRequestUserInputParams.d.ts +1 -0
  517. package/dist/sdk/providers/codex-protocol/generated/v2/ToolRequestUserInputParams.d.ts.map +1 -1
  518. package/dist/sdk/providers/codex-protocol/generated/v2/TurnEnvironmentParams.d.ts +2 -2
  519. package/dist/sdk/providers/codex-protocol/generated/v2/TurnEnvironmentParams.d.ts.map +1 -1
  520. package/dist/sdk/providers/codex-protocol/generated/v2/TurnStartParams.d.ts +17 -5
  521. package/dist/sdk/providers/codex-protocol/generated/v2/TurnStartParams.d.ts.map +1 -1
  522. package/dist/sdk/providers/codex-protocol/generated/v2/TurnSteerParams.d.ts +8 -1
  523. package/dist/sdk/providers/codex-protocol/generated/v2/TurnSteerParams.d.ts.map +1 -1
  524. package/dist/sdk/providers/codex-protocol/generated/v2/TurnsPage.d.ts +7 -0
  525. package/dist/sdk/providers/codex-protocol/generated/v2/TurnsPage.d.ts.map +1 -0
  526. package/dist/sdk/providers/codex-protocol/generated/v2/TurnsPage.js +3 -0
  527. package/dist/sdk/providers/codex-protocol/generated/v2/TurnsPage.js.map +1 -0
  528. package/dist/sdk/providers/codex-protocol/index.d.ts +7 -0
  529. package/dist/sdk/providers/codex-protocol/index.d.ts.map +1 -1
  530. package/dist/sdk/providers/codex.d.ts +26 -4
  531. package/dist/sdk/providers/codex.d.ts.map +1 -1
  532. package/dist/sdk/providers/codex.js +457 -37
  533. package/dist/sdk/providers/codex.js.map +1 -1
  534. package/dist/sdk/providers/env-filter.d.ts.map +1 -1
  535. package/dist/sdk/providers/env-filter.js +19 -1
  536. package/dist/sdk/providers/env-filter.js.map +1 -1
  537. package/dist/sdk/providers/gemini-tools.d.ts +28 -0
  538. package/dist/sdk/providers/gemini-tools.d.ts.map +1 -0
  539. package/dist/sdk/providers/gemini-tools.js +57 -0
  540. package/dist/sdk/providers/gemini-tools.js.map +1 -0
  541. package/dist/sdk/providers/gemini.d.ts.map +1 -1
  542. package/dist/sdk/providers/gemini.js +4 -2
  543. package/dist/sdk/providers/gemini.js.map +1 -1
  544. package/dist/sdk/providers/grok-acp.d.ts +1 -1
  545. package/dist/sdk/providers/grok-acp.d.ts.map +1 -1
  546. package/dist/sdk/providers/grok-acp.js +1 -1
  547. package/dist/sdk/providers/grok-acp.js.map +1 -1
  548. package/dist/sdk/providers/index.d.ts +1 -0
  549. package/dist/sdk/providers/index.d.ts.map +1 -1
  550. package/dist/sdk/providers/index.js +6 -0
  551. package/dist/sdk/providers/index.js.map +1 -1
  552. package/dist/sdk/providers/opencode-tools.d.ts +36 -0
  553. package/dist/sdk/providers/opencode-tools.d.ts.map +1 -0
  554. package/dist/sdk/providers/opencode-tools.js +78 -0
  555. package/dist/sdk/providers/opencode-tools.js.map +1 -0
  556. package/dist/sdk/providers/opencode.d.ts +53 -5
  557. package/dist/sdk/providers/opencode.d.ts.map +1 -1
  558. package/dist/sdk/providers/opencode.js +379 -71
  559. package/dist/sdk/providers/opencode.js.map +1 -1
  560. package/dist/sdk/providers/pi-rpc-client.d.ts +90 -0
  561. package/dist/sdk/providers/pi-rpc-client.d.ts.map +1 -0
  562. package/dist/sdk/providers/pi-rpc-client.js +168 -0
  563. package/dist/sdk/providers/pi-rpc-client.js.map +1 -0
  564. package/dist/sdk/providers/pi-tools.d.ts +38 -0
  565. package/dist/sdk/providers/pi-tools.d.ts.map +1 -0
  566. package/dist/sdk/providers/pi-tools.js +214 -0
  567. package/dist/sdk/providers/pi-tools.js.map +1 -0
  568. package/dist/sdk/providers/pi.d.ts +84 -0
  569. package/dist/sdk/providers/pi.d.ts.map +1 -0
  570. package/dist/sdk/providers/pi.js +686 -0
  571. package/dist/sdk/providers/pi.js.map +1 -0
  572. package/dist/sdk/providers/staticSlashCommands.d.ts +4 -0
  573. package/dist/sdk/providers/staticSlashCommands.d.ts.map +1 -0
  574. package/dist/sdk/providers/staticSlashCommands.js +14 -0
  575. package/dist/sdk/providers/staticSlashCommands.js.map +1 -0
  576. package/dist/sdk/providers/types.d.ts +144 -17
  577. package/dist/sdk/providers/types.d.ts.map +1 -1
  578. package/dist/sdk/remote-spawn.d.ts.map +1 -1
  579. package/dist/sdk/remote-spawn.js.map +1 -1
  580. package/dist/sdk/slashCommandEmulation.d.ts +9 -0
  581. package/dist/sdk/slashCommandEmulation.d.ts.map +1 -1
  582. package/dist/sdk/slashCommandEmulation.js +15 -0
  583. package/dist/sdk/slashCommandEmulation.js.map +1 -1
  584. package/dist/sdk/types.d.ts +40 -0
  585. package/dist/sdk/types.d.ts.map +1 -1
  586. package/dist/security/approvalAuditLog.d.ts +3 -2
  587. package/dist/security/approvalAuditLog.d.ts.map +1 -1
  588. package/dist/security/approvalAuditLog.js +62 -2
  589. package/dist/security/approvalAuditLog.js.map +1 -1
  590. package/dist/services/BrowserProfileService.d.ts +21 -0
  591. package/dist/services/BrowserProfileService.d.ts.map +1 -1
  592. package/dist/services/BrowserProfileService.js +74 -1
  593. package/dist/services/BrowserProfileService.js.map +1 -1
  594. package/dist/services/CacheMissBillingMonitor.d.ts +25 -0
  595. package/dist/services/CacheMissBillingMonitor.d.ts.map +1 -0
  596. package/dist/services/CacheMissBillingMonitor.js +179 -0
  597. package/dist/services/CacheMissBillingMonitor.js.map +1 -0
  598. package/dist/services/CodexUpdateChecker.d.ts.map +1 -1
  599. package/dist/services/CodexUpdateChecker.js +3 -2
  600. package/dist/services/CodexUpdateChecker.js.map +1 -1
  601. package/dist/services/ModelInfoService.d.ts +58 -9
  602. package/dist/services/ModelInfoService.d.ts.map +1 -1
  603. package/dist/services/ModelInfoService.js +127 -14
  604. package/dist/services/ModelInfoService.js.map +1 -1
  605. package/dist/services/ProjectQueueScheduler.d.ts +91 -0
  606. package/dist/services/ProjectQueueScheduler.d.ts.map +1 -0
  607. package/dist/services/ProjectQueueScheduler.js +404 -0
  608. package/dist/services/ProjectQueueScheduler.js.map +1 -0
  609. package/dist/services/ProjectQueueService.d.ts +60 -0
  610. package/dist/services/ProjectQueueService.d.ts.map +1 -0
  611. package/dist/services/ProjectQueueService.js +804 -0
  612. package/dist/services/ProjectQueueService.js.map +1 -0
  613. package/dist/services/RelayClientService.d.ts +5 -0
  614. package/dist/services/RelayClientService.d.ts.map +1 -1
  615. package/dist/services/RelayClientService.js +26 -12
  616. package/dist/services/RelayClientService.js.map +1 -1
  617. package/dist/services/SafeRestartService.d.ts +48 -0
  618. package/dist/services/SafeRestartService.d.ts.map +1 -0
  619. package/dist/services/SafeRestartService.js +173 -0
  620. package/dist/services/SafeRestartService.js.map +1 -0
  621. package/dist/services/ServerSettingsService.d.ts +41 -1
  622. package/dist/services/ServerSettingsService.d.ts.map +1 -1
  623. package/dist/services/ServerSettingsService.js +110 -1
  624. package/dist/services/ServerSettingsService.js.map +1 -1
  625. package/dist/services/SessionQueuePersistenceService.d.ts +55 -0
  626. package/dist/services/SessionQueuePersistenceService.d.ts.map +1 -0
  627. package/dist/services/SessionQueuePersistenceService.js +264 -0
  628. package/dist/services/SessionQueuePersistenceService.js.map +1 -0
  629. package/dist/services/WorkstreamService.d.ts +92 -0
  630. package/dist/services/WorkstreamService.d.ts.map +1 -0
  631. package/dist/services/WorkstreamService.js +627 -0
  632. package/dist/services/WorkstreamService.js.map +1 -0
  633. package/dist/services/index.d.ts +4 -0
  634. package/dist/services/index.d.ts.map +1 -1
  635. package/dist/services/index.js +4 -0
  636. package/dist/services/index.js.map +1 -1
  637. package/dist/services/projectWorkIdle.d.ts +42 -0
  638. package/dist/services/projectWorkIdle.d.ts.map +1 -0
  639. package/dist/services/projectWorkIdle.js +50 -0
  640. package/dist/services/projectWorkIdle.js.map +1 -0
  641. package/dist/services/voice/SpeechBackend.d.ts +18 -1
  642. package/dist/services/voice/SpeechBackend.d.ts.map +1 -1
  643. package/dist/services/voice/SpeechBackend.js +3 -0
  644. package/dist/services/voice/SpeechBackend.js.map +1 -1
  645. package/dist/services/voice/audioRetention.d.ts +20 -0
  646. package/dist/services/voice/audioRetention.d.ts.map +1 -1
  647. package/dist/services/voice/audioRetention.js +2 -0
  648. package/dist/services/voice/audioRetention.js.map +1 -1
  649. package/dist/services/voice/deepgramBackend.d.ts.map +1 -1
  650. package/dist/services/voice/deepgramBackend.js +4 -1
  651. package/dist/services/voice/deepgramBackend.js.map +1 -1
  652. package/dist/services/voice/localNemoBackend.d.ts +31 -0
  653. package/dist/services/voice/localNemoBackend.d.ts.map +1 -0
  654. package/dist/services/voice/localNemoBackend.js +181 -0
  655. package/dist/services/voice/localNemoBackend.js.map +1 -0
  656. package/dist/services/voice/localParakeetBackend.d.ts +31 -0
  657. package/dist/services/voice/localParakeetBackend.d.ts.map +1 -0
  658. package/dist/services/voice/localParakeetBackend.js +180 -0
  659. package/dist/services/voice/localParakeetBackend.js.map +1 -0
  660. package/dist/services/voice/localSttRuntime.d.ts +21 -0
  661. package/dist/services/voice/localSttRuntime.d.ts.map +1 -0
  662. package/dist/services/voice/localSttRuntime.js +87 -0
  663. package/dist/services/voice/localSttRuntime.js.map +1 -0
  664. package/dist/services/voice/localWhisperBackend.d.ts +2 -1
  665. package/dist/services/voice/localWhisperBackend.d.ts.map +1 -1
  666. package/dist/services/voice/localWhisperBackend.js +47 -34
  667. package/dist/services/voice/localWhisperBackend.js.map +1 -1
  668. package/dist/services/voice/nemo_worker.py +232 -0
  669. package/dist/services/voice/parakeet_worker.py +151 -0
  670. package/dist/services/voice/registry.d.ts +19 -4
  671. package/dist/services/voice/registry.d.ts.map +1 -1
  672. package/dist/services/voice/registry.js +72 -22
  673. package/dist/services/voice/registry.js.map +1 -1
  674. package/dist/services/voice/serialQueue.d.ts +17 -0
  675. package/dist/services/voice/serialQueue.d.ts.map +1 -0
  676. package/dist/services/voice/serialQueue.js +24 -0
  677. package/dist/services/voice/serialQueue.js.map +1 -0
  678. package/dist/services/voice/whisper_worker.py +94 -0
  679. package/dist/services/voice/xaiSttBackend.d.ts +1 -1
  680. package/dist/services/voice/xaiSttBackend.d.ts.map +1 -1
  681. package/dist/services/voice/xaiSttBackend.js +15 -3
  682. package/dist/services/voice/xaiSttBackend.js.map +1 -1
  683. package/dist/sessions/agent-excerpt.d.ts +29 -0
  684. package/dist/sessions/agent-excerpt.d.ts.map +1 -0
  685. package/dist/sessions/agent-excerpt.js +128 -0
  686. package/dist/sessions/agent-excerpt.js.map +1 -0
  687. package/dist/sessions/claude-messages.d.ts.map +1 -1
  688. package/dist/sessions/claude-messages.js +75 -4
  689. package/dist/sessions/claude-messages.js.map +1 -1
  690. package/dist/sessions/claude-summary.d.ts +33 -0
  691. package/dist/sessions/claude-summary.d.ts.map +1 -0
  692. package/dist/sessions/claude-summary.js +461 -0
  693. package/dist/sessions/claude-summary.js.map +1 -0
  694. package/dist/sessions/codex-discovery.d.ts +46 -0
  695. package/dist/sessions/codex-discovery.d.ts.map +1 -0
  696. package/dist/sessions/codex-discovery.js +269 -0
  697. package/dist/sessions/codex-discovery.js.map +1 -0
  698. package/dist/sessions/codex-reader.d.ts +96 -13
  699. package/dist/sessions/codex-reader.d.ts.map +1 -1
  700. package/dist/sessions/codex-reader.js +1069 -141
  701. package/dist/sessions/codex-reader.js.map +1 -1
  702. package/dist/sessions/dag.d.ts +25 -4
  703. package/dist/sessions/dag.d.ts.map +1 -1
  704. package/dist/sessions/dag.js +37 -4
  705. package/dist/sessions/dag.js.map +1 -1
  706. package/dist/sessions/gemini-reader.d.ts +3 -1
  707. package/dist/sessions/gemini-reader.d.ts.map +1 -1
  708. package/dist/sessions/gemini-reader.js +17 -8
  709. package/dist/sessions/gemini-reader.js.map +1 -1
  710. package/dist/sessions/grok-reader.d.ts +1 -0
  711. package/dist/sessions/grok-reader.d.ts.map +1 -1
  712. package/dist/sessions/grok-reader.js +11 -5
  713. package/dist/sessions/grok-reader.js.map +1 -1
  714. package/dist/sessions/normalization.d.ts +3 -1
  715. package/dist/sessions/normalization.d.ts.map +1 -1
  716. package/dist/sessions/normalization.js +72 -16
  717. package/dist/sessions/normalization.js.map +1 -1
  718. package/dist/sessions/null-reader.d.ts +31 -0
  719. package/dist/sessions/null-reader.d.ts.map +1 -0
  720. package/dist/sessions/null-reader.js +30 -0
  721. package/dist/sessions/null-reader.js.map +1 -0
  722. package/dist/sessions/opencode-db-reader.d.ts +66 -0
  723. package/dist/sessions/opencode-db-reader.d.ts.map +1 -0
  724. package/dist/sessions/opencode-db-reader.js +333 -0
  725. package/dist/sessions/opencode-db-reader.js.map +1 -0
  726. package/dist/sessions/opencode-reader.d.ts +50 -0
  727. package/dist/sessions/opencode-reader.d.ts.map +1 -1
  728. package/dist/sessions/opencode-reader.js +375 -71
  729. package/dist/sessions/opencode-reader.js.map +1 -1
  730. package/dist/sessions/pagination.d.ts.map +1 -1
  731. package/dist/sessions/pagination.js +119 -3
  732. package/dist/sessions/pagination.js.map +1 -1
  733. package/dist/sessions/persisted-augments.d.ts +2 -1
  734. package/dist/sessions/persisted-augments.d.ts.map +1 -1
  735. package/dist/sessions/persisted-augments.js +2 -2
  736. package/dist/sessions/persisted-augments.js.map +1 -1
  737. package/dist/sessions/pi-fork.d.ts +12 -0
  738. package/dist/sessions/pi-fork.d.ts.map +1 -0
  739. package/dist/sessions/pi-fork.js +125 -0
  740. package/dist/sessions/pi-fork.js.map +1 -0
  741. package/dist/sessions/pi-reader.d.ts +81 -0
  742. package/dist/sessions/pi-reader.d.ts.map +1 -0
  743. package/dist/sessions/pi-reader.js +413 -0
  744. package/dist/sessions/pi-reader.js.map +1 -0
  745. package/dist/sessions/provider-resolution.d.ts +10 -3
  746. package/dist/sessions/provider-resolution.d.ts.map +1 -1
  747. package/dist/sessions/provider-resolution.js +62 -6
  748. package/dist/sessions/provider-resolution.js.map +1 -1
  749. package/dist/sessions/reader.d.ts +17 -24
  750. package/dist/sessions/reader.d.ts.map +1 -1
  751. package/dist/sessions/reader.js +86 -157
  752. package/dist/sessions/reader.js.map +1 -1
  753. package/dist/sessions/recap-overlays.d.ts +38 -0
  754. package/dist/sessions/recap-overlays.d.ts.map +1 -0
  755. package/dist/sessions/recap-overlays.js +176 -0
  756. package/dist/sessions/recap-overlays.js.map +1 -0
  757. package/dist/sessions/summary-parser-worker-client.d.ts +80 -0
  758. package/dist/sessions/summary-parser-worker-client.d.ts.map +1 -0
  759. package/dist/sessions/summary-parser-worker-client.js +539 -0
  760. package/dist/sessions/summary-parser-worker-client.js.map +1 -0
  761. package/dist/sessions/summary-parser-worker-entry.d.ts +2 -0
  762. package/dist/sessions/summary-parser-worker-entry.d.ts.map +1 -0
  763. package/dist/sessions/summary-parser-worker-entry.js +29 -0
  764. package/dist/sessions/summary-parser-worker-entry.js.map +1 -0
  765. package/dist/sessions/summary-parser-worker-protocol.d.ts +105 -0
  766. package/dist/sessions/summary-parser-worker-protocol.d.ts.map +1 -0
  767. package/dist/sessions/summary-parser-worker-protocol.js +35 -0
  768. package/dist/sessions/summary-parser-worker-protocol.js.map +1 -0
  769. package/dist/sessions/summary-parser-worker-runner.d.ts +3 -0
  770. package/dist/sessions/summary-parser-worker-runner.d.ts.map +1 -0
  771. package/dist/sessions/summary-parser-worker-runner.js +158 -0
  772. package/dist/sessions/summary-parser-worker-runner.js.map +1 -0
  773. package/dist/sessions/types.d.ts +30 -1
  774. package/dist/sessions/types.d.ts.map +1 -1
  775. package/dist/startupEnv.d.ts +2 -0
  776. package/dist/startupEnv.d.ts.map +1 -0
  777. package/dist/startupEnv.js +97 -0
  778. package/dist/startupEnv.js.map +1 -0
  779. package/dist/subscriptions.d.ts.map +1 -1
  780. package/dist/subscriptions.js +28 -18
  781. package/dist/subscriptions.js.map +1 -1
  782. package/dist/supervisor/ExternalSessionTracker.d.ts +5 -1
  783. package/dist/supervisor/ExternalSessionTracker.d.ts.map +1 -1
  784. package/dist/supervisor/ExternalSessionTracker.js +98 -6
  785. package/dist/supervisor/ExternalSessionTracker.js.map +1 -1
  786. package/dist/supervisor/Process.d.ts +252 -32
  787. package/dist/supervisor/Process.d.ts.map +1 -1
  788. package/dist/supervisor/Process.js +1233 -219
  789. package/dist/supervisor/Process.js.map +1 -1
  790. package/dist/supervisor/Supervisor.d.ts +201 -5
  791. package/dist/supervisor/Supervisor.d.ts.map +1 -1
  792. package/dist/supervisor/Supervisor.js +1074 -55
  793. package/dist/supervisor/Supervisor.js.map +1 -1
  794. package/dist/supervisor/WorkerQueue.d.ts +3 -1
  795. package/dist/supervisor/WorkerQueue.d.ts.map +1 -1
  796. package/dist/supervisor/WorkerQueue.js +1 -0
  797. package/dist/supervisor/WorkerQueue.js.map +1 -1
  798. package/dist/supervisor/composeTimeAnchor.d.ts +36 -0
  799. package/dist/supervisor/composeTimeAnchor.d.ts.map +1 -0
  800. package/dist/supervisor/composeTimeAnchor.js +51 -0
  801. package/dist/supervisor/composeTimeAnchor.js.map +1 -0
  802. package/dist/supervisor/deferredDeliverySettings.d.ts +23 -0
  803. package/dist/supervisor/deferredDeliverySettings.d.ts.map +1 -0
  804. package/dist/supervisor/deferredDeliverySettings.js +40 -0
  805. package/dist/supervisor/deferredDeliverySettings.js.map +1 -0
  806. package/dist/supervisor/liveness.d.ts +5 -2
  807. package/dist/supervisor/liveness.d.ts.map +1 -1
  808. package/dist/supervisor/liveness.js +40 -2
  809. package/dist/supervisor/liveness.js.map +1 -1
  810. package/dist/supervisor/types.d.ts +56 -5
  811. package/dist/supervisor/types.d.ts.map +1 -1
  812. package/dist/supervisor/types.js +0 -2
  813. package/dist/supervisor/types.js.map +1 -1
  814. package/dist/uploads/AttachmentStagingService.d.ts +94 -0
  815. package/dist/uploads/AttachmentStagingService.d.ts.map +1 -0
  816. package/dist/uploads/AttachmentStagingService.js +673 -0
  817. package/dist/uploads/AttachmentStagingService.js.map +1 -0
  818. package/dist/uploads/index.d.ts +2 -0
  819. package/dist/uploads/index.d.ts.map +1 -1
  820. package/dist/uploads/index.js +1 -0
  821. package/dist/uploads/index.js.map +1 -1
  822. package/dist/uploads/manager.d.ts +1 -0
  823. package/dist/uploads/manager.d.ts.map +1 -1
  824. package/dist/uploads/manager.js +72 -12
  825. package/dist/uploads/manager.js.map +1 -1
  826. package/dist/utils/codexRolloutFiles.d.ts +16 -0
  827. package/dist/utils/codexRolloutFiles.d.ts.map +1 -0
  828. package/dist/utils/codexRolloutFiles.js +45 -0
  829. package/dist/utils/codexRolloutFiles.js.map +1 -0
  830. package/dist/utils/jsonl.d.ts +8 -0
  831. package/dist/utils/jsonl.d.ts.map +1 -1
  832. package/dist/utils/jsonl.js +158 -5
  833. package/dist/utils/jsonl.js.map +1 -1
  834. package/dist/utils/publicShareViewerUrl.d.ts.map +1 -1
  835. package/dist/utils/publicShareViewerUrl.js +2 -15
  836. package/dist/utils/publicShareViewerUrl.js.map +1 -1
  837. package/dist/watcher/EventBus.d.ts +42 -4
  838. package/dist/watcher/EventBus.d.ts.map +1 -1
  839. package/dist/watcher/EventBus.js.map +1 -1
  840. package/dist/watcher/FileWatcher.d.ts +47 -0
  841. package/dist/watcher/FileWatcher.d.ts.map +1 -1
  842. package/dist/watcher/FileWatcher.js +185 -14
  843. package/dist/watcher/FileWatcher.js.map +1 -1
  844. package/dist/watcher/index.d.ts +2 -2
  845. package/dist/watcher/index.d.ts.map +1 -1
  846. package/dist/watcher/index.js.map +1 -1
  847. package/dist/yaModuleEnv.d.ts +6 -6
  848. package/dist/yaModuleEnv.d.ts.map +1 -1
  849. package/dist/yaModuleEnv.js +12 -12
  850. package/dist/yaModuleEnv.js.map +1 -1
  851. package/package.json +5 -6
  852. package/client-dist/assets/de-BuEb60Yc.js +0 -6
  853. package/client-dist/assets/es-CRlmPKnE.js +0 -6
  854. package/client-dist/assets/fr-Cglgjc2X.js +0 -6
  855. package/client-dist/assets/index-BNj7ibmq.js +0 -524
  856. package/client-dist/assets/index-CAmsUazi.css +0 -1
  857. package/client-dist/assets/ja-DMb9mFPv.js +0 -6
  858. package/client-dist/assets/zh-CN-D1tbfamz.js +0 -6
@@ -10,14 +10,53 @@
10
10
  *
11
11
  * Unlike Claude's DAG structure, Codex sessions are linear.
12
12
  */
13
+ import { createHash, randomUUID } from "node:crypto";
13
14
  import { open, readdir, stat } from "node:fs/promises";
14
15
  import { join } from "node:path";
15
16
  import { getModelContextWindow, parseCodexSessionEntry, truncateSessionTitle, } from "../../bundled/@yep-anywhere/shared/dist/index.js";
16
- import { canonicalizeProjectPath } from "../projects/paths.js";
17
- import { readFirstLine, readJsonlLines } from "../utils/jsonl.js";
18
- const CODEX_META_READ_MAX_BYTES = 1024 * 1024;
17
+ import { getLogger } from "../logging/logger.js";
18
+ import { canonicalizeProjectPath, getProjectIdentityKey, } from "../projects/paths.js";
19
+ import { codexRolloutRepresentation, isCodexRolloutFileName, preferPlainCodexRollouts, } from "../utils/codexRolloutFiles.js";
20
+ import { iterateJsonlLines, readJsonlLines } from "../utils/jsonl.js";
21
+ import { createCodexSessionDiscoveryIndex, createCodexRolloutDiscoveryStats, readCodexRolloutMetadata, } from "./codex-discovery.js";
22
+ import { normalizeSession } from "./normalization.js";
23
+ import { SummaryParserClient } from "./summary-parser-worker-client.js";
19
24
  const CODEX_SCAN_CACHE_TTL_MS = 5000;
25
+ const DEFAULT_SLOW_LOG_THRESHOLD_MS = 250;
26
+ const CODEX_HEAD_SUMMARY_MAX_LINES = 200;
27
+ const CODEX_HEAD_SUMMARY_MAX_BYTES = 1024 * 1024;
28
+ const CODEX_FULL_SUMMARY_CACHE_MAX_ENTRIES = 256;
29
+ const LOG_ENTRY_READS = process.env.CODEX_READER_LOG_PARSE === "true";
30
+ function isCompressedCodexSessionFile(filePath) {
31
+ return filePath.endsWith(".jsonl.zst");
32
+ }
20
33
  const codexSharedScanCache = new Map();
34
+ const codexFullSummaryCache = new Map();
35
+ function getCodexFullSummaryCacheKey(filePath, stats) {
36
+ return `${filePath}\0${Number(stats.mtimeMs)}\0${Number(stats.size)}`;
37
+ }
38
+ function cloneSessionSummary(summary) {
39
+ if (!summary)
40
+ return null;
41
+ return {
42
+ ...summary,
43
+ ownership: { ...summary.ownership },
44
+ ...(summary.contextUsage
45
+ ? { contextUsage: { ...summary.contextUsage } }
46
+ : {}),
47
+ };
48
+ }
49
+ function trimCodexFullSummaryCache() {
50
+ if (codexFullSummaryCache.size <= CODEX_FULL_SUMMARY_CACHE_MAX_ENTRIES) {
51
+ return;
52
+ }
53
+ const entriesToDelete = Array.from(codexFullSummaryCache.entries())
54
+ .sort((left, right) => left[1].lastAccessedAt - right[1].lastAccessedAt)
55
+ .slice(0, codexFullSummaryCache.size - CODEX_FULL_SUMMARY_CACHE_MAX_ENTRIES);
56
+ for (const [cacheKey] of entriesToDelete) {
57
+ codexFullSummaryCache.delete(cacheKey);
58
+ }
59
+ }
21
60
  function parseCodexJsonlChunk(chunk, mayEndWithPartialLine) {
22
61
  const lines = chunk.split("\n");
23
62
  const partialLine = mayEndWithPartialLine ? (lines.pop() ?? "") : "";
@@ -34,6 +73,94 @@ function parseCodexJsonlChunk(chunk, mayEndWithPartialLine) {
34
73
  }
35
74
  return { entries, partialLine };
36
75
  }
76
+ function getCodexMessagePayloadText(content) {
77
+ return content
78
+ .map((block) => (typeof block.text === "string" ? block.text : block.type))
79
+ .join("\n");
80
+ }
81
+ function getCodexEntryDedupeKey(entry) {
82
+ if (entry.type === "response_item") {
83
+ const { payload } = entry;
84
+ if (payload.type === "message") {
85
+ return [
86
+ entry.type,
87
+ entry.timestamp,
88
+ payload.type,
89
+ payload.role,
90
+ getCodexMessagePayloadText(payload.content),
91
+ ].join("\n");
92
+ }
93
+ return null;
94
+ }
95
+ if (entry.type === "event_msg") {
96
+ const { payload } = entry;
97
+ if (payload.type === "user_message" || payload.type === "agent_message") {
98
+ return [entry.type, entry.timestamp, payload.type, payload.message].join("\n");
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ function getCodexSummaryDedupeKey(entry) {
104
+ if (entry.type === "response_item") {
105
+ const { payload } = entry;
106
+ if (payload.type !== "message") {
107
+ return null;
108
+ }
109
+ const hash = createHash("sha256");
110
+ hash.update(entry.type);
111
+ hash.update("\0");
112
+ hash.update(entry.timestamp);
113
+ hash.update("\0");
114
+ hash.update(payload.type);
115
+ hash.update("\0");
116
+ hash.update(payload.role);
117
+ hash.update("\0");
118
+ payload.content.forEach((block, index) => {
119
+ if (index > 0)
120
+ hash.update("\n");
121
+ hash.update("text" in block && typeof block.text === "string"
122
+ ? block.text
123
+ : block.type);
124
+ });
125
+ return hash.digest("base64url");
126
+ }
127
+ if (entry.type === "event_msg") {
128
+ const { payload } = entry;
129
+ if (payload.type !== "user_message" && payload.type !== "agent_message") {
130
+ return null;
131
+ }
132
+ const hash = createHash("sha256");
133
+ hash.update(entry.type);
134
+ hash.update("\0");
135
+ hash.update(entry.timestamp);
136
+ hash.update("\0");
137
+ hash.update(payload.type);
138
+ hash.update("\0");
139
+ hash.update(payload.message);
140
+ return hash.digest("base64url");
141
+ }
142
+ return null;
143
+ }
144
+ function dedupeCodexEntries(entries) {
145
+ const seen = new Set();
146
+ let deduped = null;
147
+ entries.forEach((entry, index) => {
148
+ const key = getCodexEntryDedupeKey(entry);
149
+ if (!key) {
150
+ deduped?.push(entry);
151
+ return;
152
+ }
153
+ if (seen.has(key)) {
154
+ if (!deduped) {
155
+ deduped = entries.slice(0, index);
156
+ }
157
+ return;
158
+ }
159
+ seen.add(key);
160
+ deduped?.push(entry);
161
+ });
162
+ return deduped ?? entries;
163
+ }
37
164
  /**
38
165
  * Codex-specific session reader for Codex CLI JSONL files.
39
166
  *
@@ -43,6 +170,14 @@ function parseCodexJsonlChunk(chunk, mayEndWithPartialLine) {
43
170
  export class CodexSessionReader {
44
171
  sessionsDir;
45
172
  projectPath;
173
+ projectIdentityKey;
174
+ dataDir;
175
+ discoveryIndex;
176
+ slowLogThresholdMs;
177
+ summaryParserWorkerMode;
178
+ summaryParserClient;
179
+ lastScanMetrics = null;
180
+ lastSummaryStreamMetrics = null;
46
181
  // Cache of session ID -> file path for quick lookups
47
182
  sessionFileCache = new Map();
48
183
  entryCache = new Map();
@@ -51,6 +186,21 @@ export class CodexSessionReader {
51
186
  this.projectPath = options.projectPath
52
187
  ? canonicalizeProjectPath(options.projectPath)
53
188
  : undefined;
189
+ this.projectIdentityKey = this.projectPath
190
+ ? getProjectIdentityKey(this.projectPath)
191
+ : undefined;
192
+ this.dataDir = options.dataDir;
193
+ this.discoveryIndex =
194
+ options.discoveryIndex ??
195
+ createCodexSessionDiscoveryIndex(options.dataDir, this.sessionsDir);
196
+ this.slowLogThresholdMs = Math.max(0, options.slowLogThresholdMs ?? DEFAULT_SLOW_LOG_THRESHOLD_MS);
197
+ this.summaryParserWorkerMode = options.summaryParserWorkerMode ?? "off";
198
+ this.summaryParserClient = options.summaryParserClient;
199
+ }
200
+ async close() {
201
+ const client = this.summaryParserClient;
202
+ this.summaryParserClient = undefined;
203
+ await client?.close();
54
204
  }
55
205
  invalidateCache() {
56
206
  this.sessionFileCache.clear();
@@ -61,16 +211,44 @@ export class CodexSessionReader {
61
211
  }
62
212
  }
63
213
  }
214
+ getLastScanMetrics() {
215
+ return this.lastScanMetrics
216
+ ? cloneCodexSessionReaderScanMetrics(this.lastScanMetrics)
217
+ : null;
218
+ }
219
+ getEntryCacheStats() {
220
+ let entries = 0;
221
+ let sourceBytes = 0;
222
+ let partialLineBytes = 0;
223
+ for (const cached of this.entryCache.values()) {
224
+ entries += cached.entries.length;
225
+ sourceBytes += cached.size;
226
+ partialLineBytes += cached.partialLine.length;
227
+ }
228
+ return {
229
+ sessions: this.entryCache.size,
230
+ entries,
231
+ sourceBytes,
232
+ partialLineBytes,
233
+ };
234
+ }
235
+ getLastSummaryStreamMetrics() {
236
+ return this.lastSummaryStreamMetrics
237
+ ? { ...this.lastSummaryStreamMetrics }
238
+ : null;
239
+ }
64
240
  async listSessions(projectId) {
65
241
  const summaries = [];
66
242
  const sessions = await this.scanSessions();
67
243
  for (const session of sessions) {
68
244
  // Filter by project path if set
69
- if (this.projectPath &&
70
- canonicalizeProjectPath(session.cwd) !== this.projectPath) {
245
+ if (this.projectIdentityKey &&
246
+ getProjectIdentityKey(session.cwd) !== this.projectIdentityKey) {
71
247
  continue;
72
248
  }
73
- const summary = await this.getSessionSummary(session.id, projectId);
249
+ const summary = await this.getSessionSummary(session.id, projectId, {
250
+ readMode: "head",
251
+ });
74
252
  if (summary) {
75
253
  summaries.push(summary);
76
254
  }
@@ -79,87 +257,83 @@ export class CodexSessionReader {
79
257
  summaries.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
80
258
  return summaries;
81
259
  }
82
- async getSessionSummary(sessionId, projectId) {
260
+ async getSessionSummary(sessionId, projectId, options) {
83
261
  const sessionFile = await this.findSessionFile(sessionId);
84
262
  if (!sessionFile)
85
263
  return null;
86
264
  try {
87
- const entries = await this.readEntries(sessionId, sessionFile.filePath);
88
- if (entries.length === 0)
89
- return null;
90
- // Extract session metadata from first entry
91
- const metaEntry = entries.find((e) => e.type === "session_meta");
92
- if (!metaEntry)
93
- return null;
265
+ const inProcessParser = () => this.buildSessionSummaryFromStream(sessionId, projectId, sessionFile.filePath, options);
266
+ if (options?.readMode === "head" ||
267
+ this.summaryParserWorkerMode === "off") {
268
+ if (options?.readMode === "head") {
269
+ return await inProcessParser();
270
+ }
271
+ const stats = await stat(sessionFile.filePath);
272
+ return await this.getCoalescedFullSessionSummary(sessionFile.filePath, stats, () => this.buildSessionSummaryFromKnownStats(sessionId, projectId, sessionFile.filePath, stats, options));
273
+ }
94
274
  const stats = await stat(sessionFile.filePath);
95
- const { title, fullTitle } = this.extractTitle(entries);
96
- const messageCount = this.countMessages(entries);
97
- const model = this.extractModel(entries);
98
- const provider = this.determineProvider(metaEntry, model);
99
- const turnContext = this.extractTurnContext(entries);
100
- const contextUsage = this.extractContextUsage(entries, model, provider);
101
- const parentSessionId = typeof metaEntry.payload.forked_from_id === "string"
102
- ? metaEntry.payload.forked_from_id
103
- : undefined;
104
- // Skip sessions with no actual conversation messages
105
- if (messageCount === 0)
106
- return null;
107
- return {
108
- id: sessionId,
109
- projectId,
110
- title,
111
- fullTitle,
112
- createdAt: metaEntry.payload.timestamp,
113
- updatedAt: stats.mtime.toISOString(),
114
- messageCount,
115
- ownership: { owner: "none" },
116
- contextUsage,
117
- provider,
118
- model,
119
- parentSessionId,
120
- originator: metaEntry.payload.originator,
121
- cliVersion: metaEntry.payload.cli_version,
122
- source: metaEntry.payload.source,
123
- approvalPolicy: turnContext?.payload.approval_policy,
124
- sandboxPolicy: turnContext?.payload.sandbox_policy
125
- ? {
126
- type: turnContext.payload.sandbox_policy.type,
127
- networkAccess: turnContext.payload.sandbox_policy.network_access,
128
- excludeTmpdirEnvVar: turnContext.payload.sandbox_policy.exclude_tmpdir_env_var,
129
- excludeSlashTmp: turnContext.payload.sandbox_policy.exclude_slash_tmp,
130
- }
131
- : undefined,
132
- };
275
+ return await this.getCoalescedFullSessionSummary(sessionFile.filePath, stats, async () => {
276
+ const request = {
277
+ type: "parse",
278
+ requestId: randomUUID(),
279
+ provider: "codex",
280
+ filePath: sessionFile.filePath,
281
+ sessionId,
282
+ projectId,
283
+ stats: {
284
+ size: Number(stats.size),
285
+ mtimeMs: Number(stats.mtimeMs),
286
+ mtimeIso: stats.mtime.toISOString(),
287
+ },
288
+ sourceHints: {
289
+ codex: {
290
+ sessionsDir: this.sessionsDir,
291
+ ...(this.projectPath ? { projectPath: this.projectPath } : {}),
292
+ ...(this.dataDir ? { dataDir: this.dataDir } : {}),
293
+ },
294
+ },
295
+ };
296
+ const result = await this.getSummaryParserClient().parse(request, inProcessParser);
297
+ return result.summary;
298
+ });
133
299
  }
134
300
  catch {
135
301
  return null;
136
302
  }
137
303
  }
138
304
  async getSession(sessionId, projectId, afterMessageId, _options) {
139
- const summary = await this.getSessionSummary(sessionId, projectId);
140
- if (!summary)
141
- return null;
142
305
  const sessionFile = await this.findSessionFile(sessionId);
143
306
  if (!sessionFile)
144
307
  return null;
145
- const entries = await this.readEntries(sessionId, sessionFile.filePath);
146
- // Filter entries if needed (for incremental fetching)
147
- // Note: Codex entries are not 1:1 with messages, so standard ID filtering is tricky
148
- // with raw format. We return all entries for now.
149
- // Ideally the client handles diffing/appending.
150
- const finalEntries = entries;
151
- if (afterMessageId) {
152
- // Logic to filter entries would go here if strict incremental loading is needed
153
- }
154
- return {
155
- summary,
156
- data: {
157
- provider: this.determineProviderFromEntries(entries),
158
- session: {
159
- entries: finalEntries,
308
+ try {
309
+ const entries = await this.readEntries(sessionId, sessionFile.filePath, {
310
+ purpose: "detail",
311
+ cache: true,
312
+ });
313
+ const summary = await this.buildSessionSummaryFromEntries(sessionId, projectId, sessionFile, entries);
314
+ if (!summary)
315
+ return null;
316
+ // Filter entries if needed (for incremental fetching)
317
+ // Note: Codex entries are not 1:1 with messages, so standard ID filtering is tricky
318
+ // with raw format. We return all entries for now.
319
+ // Ideally the client handles diffing/appending.
320
+ const finalEntries = entries;
321
+ if (afterMessageId) {
322
+ // Logic to filter entries would go here if strict incremental loading is needed
323
+ }
324
+ return {
325
+ summary,
326
+ data: {
327
+ provider: this.determineProviderFromEntries(entries),
328
+ session: {
329
+ entries: finalEntries,
330
+ },
160
331
  },
161
- },
162
- };
332
+ };
333
+ }
334
+ catch {
335
+ return null;
336
+ }
163
337
  }
164
338
  async getSessionSummaryIfChanged(sessionId, projectId, cachedMtime, cachedSize) {
165
339
  const sessionFile = await this.findSessionFile(sessionId);
@@ -182,19 +356,86 @@ export class CodexSessionReader {
182
356
  return null;
183
357
  }
184
358
  }
185
- /**
186
- * Codex doesn't have subagent sessions like Claude.
187
- * Returns empty array for compatibility.
188
- */
189
359
  async getAgentMappings() {
190
- return [];
360
+ const sessions = await this.scanSessions();
361
+ const mappings = [];
362
+ const seenToolUseIds = new Set();
363
+ for (const session of sessions) {
364
+ if (this.projectIdentityKey &&
365
+ getProjectIdentityKey(session.cwd) !== this.projectIdentityKey) {
366
+ continue;
367
+ }
368
+ const entries = await this.readEntries(session.id, session.filePath, {
369
+ purpose: "agent-mapping",
370
+ cache: false,
371
+ });
372
+ const spawnAgentCallIds = new Set();
373
+ for (const entry of entries) {
374
+ if (entry.type !== "response_item") {
375
+ continue;
376
+ }
377
+ const payload = entry.payload;
378
+ if (payload.type === "function_call" &&
379
+ payload.name === "spawn_agent") {
380
+ spawnAgentCallIds.add(payload.call_id);
381
+ continue;
382
+ }
383
+ if (payload.type !== "function_call_output" ||
384
+ !spawnAgentCallIds.has(payload.call_id) ||
385
+ seenToolUseIds.has(payload.call_id)) {
386
+ continue;
387
+ }
388
+ const agentId = parseCodexSpawnAgentOutput(payload.output);
389
+ if (!agentId) {
390
+ continue;
391
+ }
392
+ mappings.push({ toolUseId: payload.call_id, agentId });
393
+ seenToolUseIds.add(payload.call_id);
394
+ }
395
+ }
396
+ return mappings;
191
397
  }
192
- /**
193
- * Codex doesn't have subagent sessions like Claude.
194
- * Returns null for compatibility.
195
- */
196
- async getAgentSession(_agentId) {
197
- return null;
398
+ async getAgentSession(agentId) {
399
+ const sessionFile = await this.findSessionFile(agentId);
400
+ if (!sessionFile)
401
+ return null;
402
+ const entries = await this.readEntries(agentId, sessionFile.filePath, {
403
+ purpose: "subagent",
404
+ cache: true,
405
+ });
406
+ if (entries.length === 0)
407
+ return null;
408
+ const metaEntry = entries.find((e) => e.type === "session_meta");
409
+ if (!metaEntry)
410
+ return null;
411
+ const { title, fullTitle } = this.extractTitle(entries);
412
+ const provider = this.determineProviderFromEntries(entries);
413
+ const summary = {
414
+ id: agentId,
415
+ projectId: "codex-subagent",
416
+ title,
417
+ fullTitle,
418
+ createdAt: metaEntry.payload.timestamp,
419
+ updatedAt: sessionFile.timestamp,
420
+ messageCount: this.countMessages(entries),
421
+ ownership: { owner: "none" },
422
+ provider,
423
+ };
424
+ const loaded = {
425
+ summary,
426
+ data: {
427
+ provider,
428
+ session: { entries },
429
+ },
430
+ };
431
+ const session = normalizeSession(loaded);
432
+ return {
433
+ messages: session.messages.map((message) => ({
434
+ ...message,
435
+ isSubagent: true,
436
+ })),
437
+ status: inferCodexAgentStatus(entries),
438
+ };
198
439
  }
199
440
  /**
200
441
  * Scan the sessions directory and find all session files.
@@ -204,15 +445,37 @@ export class CodexSessionReader {
204
445
  const cached = codexSharedScanCache.get(cacheKey);
205
446
  const now = Date.now();
206
447
  if (cached && now - cached.timestamp < CODEX_SCAN_CACHE_TTL_MS) {
448
+ const metrics = createCodexSessionReaderScanMetrics({
449
+ sessionsDir: this.sessionsDir,
450
+ projectPath: this.projectPath,
451
+ activeAfterMs: options?.activeAfterMs,
452
+ cacheKey,
453
+ sharedCacheStatus: cached.inFlight ? "in-flight" : "hit",
454
+ });
455
+ const startedAt = Date.now();
207
456
  if (cached.inFlight) {
208
457
  const sessions = await cached.inFlight;
209
458
  this.hydrateSessionFileCache(sessions);
210
- return sessions.filter((session) => !session.isSubagent);
459
+ const visibleSessions = this.filterVisibleSessionsForScanMetrics(sessions, metrics);
460
+ metrics.durationMs = Date.now() - startedAt;
461
+ this.recordScanMetrics(metrics);
462
+ return visibleSessions;
211
463
  }
212
464
  this.hydrateSessionFileCache(cached.sessions);
213
- return cached.sessions.filter((session) => !session.isSubagent);
465
+ const visibleSessions = this.filterVisibleSessionsForScanMetrics(cached.sessions, metrics);
466
+ metrics.durationMs = Date.now() - startedAt;
467
+ this.recordScanMetrics(metrics);
468
+ return visibleSessions;
214
469
  }
215
- const inFlight = this.scanSessionsUncached(options);
470
+ const metrics = createCodexSessionReaderScanMetrics({
471
+ sessionsDir: this.sessionsDir,
472
+ projectPath: this.projectPath,
473
+ activeAfterMs: options?.activeAfterMs,
474
+ cacheKey,
475
+ sharedCacheStatus: "miss",
476
+ });
477
+ const startedAt = Date.now();
478
+ const inFlight = this.scanSessionsUncached(options, metrics);
216
479
  codexSharedScanCache.set(cacheKey, {
217
480
  timestamp: now,
218
481
  sessions: [],
@@ -225,9 +488,14 @@ export class CodexSessionReader {
225
488
  sessions,
226
489
  });
227
490
  this.hydrateSessionFileCache(sessions);
228
- return sessions.filter((session) => !session.isSubagent);
491
+ const visibleSessions = this.filterVisibleSessionsForScanMetrics(sessions, metrics);
492
+ metrics.durationMs = Date.now() - startedAt;
493
+ this.recordScanMetrics(metrics);
494
+ return visibleSessions;
229
495
  }
230
496
  catch (error) {
497
+ metrics.durationMs = Date.now() - startedAt;
498
+ this.recordScanMetrics(metrics);
231
499
  const entry = codexSharedScanCache.get(cacheKey);
232
500
  if (entry?.inFlight === inFlight) {
233
501
  codexSharedScanCache.delete(cacheKey);
@@ -243,14 +511,54 @@ export class CodexSessionReader {
243
511
  this.sessionFileCache.set(session.id, session);
244
512
  }
245
513
  }
246
- async scanSessionsUncached(options) {
514
+ filterVisibleSessionsForScanMetrics(sessions, metrics) {
515
+ const visibleSessions = sessions.filter((session) => {
516
+ if (session.isSubagent) {
517
+ metrics.subagentSessionsSkipped += 1;
518
+ return false;
519
+ }
520
+ return true;
521
+ });
522
+ metrics.sessionsReturned = visibleSessions.length;
523
+ return visibleSessions;
524
+ }
525
+ recordScanMetrics(metrics) {
526
+ this.lastScanMetrics = cloneCodexSessionReaderScanMetrics(metrics);
527
+ const payload = {
528
+ event: "codex_reader_scan",
529
+ ...metrics,
530
+ };
531
+ if (metrics.durationMs >= this.slowLogThresholdMs) {
532
+ getLogger().warn(payload, "CODEX_READER: slow scan");
533
+ return;
534
+ }
535
+ getLogger().debug(payload, "CODEX_READER: scan complete");
536
+ }
537
+ async scanSessionsUncached(options, metrics) {
247
538
  const sessions = [];
248
- const files = await this.findJsonlFiles(this.sessionsDir);
539
+ try {
540
+ await stat(this.sessionsDir);
541
+ if (metrics)
542
+ metrics.sessionsDirExists = true;
543
+ }
544
+ catch {
545
+ return sessions;
546
+ }
547
+ const files = await this.findJsonlFiles(this.sessionsDir, metrics);
249
548
  for (const filePath of files) {
250
- const session = await this.readSessionMeta(filePath, options);
549
+ const activeWindowSkipsBefore = metrics?.discovery.activeWindowSkips ?? 0;
550
+ const session = await this.readSessionMeta(filePath, options, metrics);
251
551
  if (session) {
252
552
  sessions.push(session);
253
553
  }
554
+ else if (metrics &&
555
+ metrics.discovery.activeWindowSkips === activeWindowSkipsBefore) {
556
+ metrics.failedFiles += 1;
557
+ }
558
+ }
559
+ await this.discoveryIndex?.flush();
560
+ if (metrics) {
561
+ metrics.sessionsParsed = sessions.length;
254
562
  }
255
563
  return sessions;
256
564
  }
@@ -259,13 +567,13 @@ export class CodexSessionReader {
259
567
  return sessionFile?.filePath ?? null;
260
568
  }
261
569
  getIndexScopeKey(sessionDir) {
262
- return `codex::${sessionDir}::${this.projectPath ?? "*"}`;
570
+ return `codex::${sessionDir}::${this.projectIdentityKey ?? "*"}`;
263
571
  }
264
572
  async listSessionFiles(_sessionDir, options) {
265
573
  const sessions = await this.scanSessions(options);
266
574
  return sessions
267
- .filter((session) => (!this.projectPath ||
268
- canonicalizeProjectPath(session.cwd) === this.projectPath) &&
575
+ .filter((session) => (!this.projectIdentityKey ||
576
+ getProjectIdentityKey(session.cwd) === this.projectIdentityKey) &&
269
577
  (!options?.activeAfterMs || session.mtime >= options.activeAfterMs))
270
578
  .map((session) => ({
271
579
  sessionId: session.id,
@@ -284,40 +592,529 @@ export class CodexSessionReader {
284
592
  await this.scanSessions();
285
593
  return this.sessionFileCache.get(sessionId) ?? null;
286
594
  }
287
- async readEntries(sessionId, filePath) {
595
+ async readEntries(sessionId, filePath, options) {
596
+ const purpose = options?.purpose ?? "detail";
597
+ const shouldWriteCache = options?.cache ?? true;
598
+ const startedAt = Date.now();
599
+ const memoryBefore = process.memoryUsage();
288
600
  const stats = await stat(filePath);
289
601
  const cached = this.entryCache.get(sessionId);
290
602
  if (cached &&
291
603
  cached.filePath === filePath &&
292
604
  cached.size === stats.size &&
293
605
  cached.mtimeMs === stats.mtimeMs) {
294
- return cached.entries;
606
+ cached.entries = dedupeCodexEntries(cached.entries);
607
+ this.recordEntryReadMetrics({
608
+ startedAt,
609
+ memoryBefore,
610
+ sessionId,
611
+ filePath,
612
+ purpose,
613
+ cacheMode: shouldWriteCache ? "read-write" : "read-only",
614
+ cacheStatus: "hit",
615
+ stats,
616
+ parsedEntries: cached.entries.length,
617
+ dedupedEntries: cached.entries.length,
618
+ });
619
+ return cached.entries.slice();
295
620
  }
296
- if (cached && cached.filePath === filePath && cached.size < stats.size) {
621
+ if (shouldWriteCache &&
622
+ cached &&
623
+ cached.filePath === filePath &&
624
+ !isCompressedCodexSessionFile(filePath) &&
625
+ cached.size < stats.size) {
626
+ const readStartedAt = Date.now();
297
627
  const appended = await this.readFileRange(filePath, cached.size, stats.size - cached.size);
628
+ const readLinesMs = Date.now() - readStartedAt;
629
+ const parseStartedAt = Date.now();
298
630
  const { entries, partialLine } = parseCodexJsonlChunk(cached.partialLine + appended, stats.size > cached.size);
631
+ const parseMs = Date.now() - parseStartedAt;
632
+ const dedupeStartedAt = Date.now();
299
633
  cached.entries.push(...entries);
634
+ cached.entries = dedupeCodexEntries(cached.entries);
635
+ const dedupeMs = Date.now() - dedupeStartedAt;
300
636
  cached.partialLine = partialLine;
301
637
  cached.size = stats.size;
302
638
  cached.mtimeMs = stats.mtimeMs;
303
- return cached.entries;
639
+ this.recordEntryReadMetrics({
640
+ startedAt,
641
+ memoryBefore,
642
+ sessionId,
643
+ filePath,
644
+ purpose,
645
+ cacheMode: "read-write",
646
+ cacheStatus: "append",
647
+ stats,
648
+ readLinesMs,
649
+ parseMs,
650
+ dedupeMs,
651
+ lineCount: entries.length,
652
+ parsedEntries: entries.length,
653
+ dedupedEntries: cached.entries.length,
654
+ });
655
+ return cached.entries.slice();
304
656
  }
657
+ const readStartedAt = Date.now();
305
658
  const lines = await readJsonlLines(filePath);
659
+ const readLinesMs = Date.now() - readStartedAt;
306
660
  const entries = [];
661
+ let maxLineLength = 0;
662
+ const parseStartedAt = Date.now();
307
663
  for (const line of lines) {
664
+ maxLineLength = Math.max(maxLineLength, line.length);
308
665
  const entry = parseCodexSessionEntry(line);
309
666
  if (entry) {
310
667
  entries.push(entry);
311
668
  }
312
669
  }
313
- this.entryCache.set(sessionId, {
670
+ const parseMs = Date.now() - parseStartedAt;
671
+ const dedupeStartedAt = Date.now();
672
+ const dedupedEntries = dedupeCodexEntries(entries);
673
+ const dedupeMs = Date.now() - dedupeStartedAt;
674
+ let cacheStoreMs = 0;
675
+ if (shouldWriteCache) {
676
+ const cacheStoreStartedAt = Date.now();
677
+ this.entryCache.set(sessionId, {
678
+ filePath,
679
+ mtimeMs: stats.mtimeMs,
680
+ size: stats.size,
681
+ entries: dedupedEntries,
682
+ partialLine: "",
683
+ });
684
+ cacheStoreMs = Date.now() - cacheStoreStartedAt;
685
+ }
686
+ this.recordEntryReadMetrics({
687
+ startedAt,
688
+ memoryBefore,
689
+ sessionId,
314
690
  filePath,
315
- mtimeMs: stats.mtimeMs,
316
- size: stats.size,
317
- entries,
318
- partialLine: "",
691
+ purpose,
692
+ cacheMode: shouldWriteCache ? "read-write" : "read-only",
693
+ cacheStatus: "miss",
694
+ stats,
695
+ readLinesMs,
696
+ parseMs,
697
+ dedupeMs,
698
+ cacheStoreMs,
699
+ lineCount: lines.length,
700
+ parsedEntries: entries.length,
701
+ dedupedEntries: dedupedEntries.length,
702
+ maxLineLength,
703
+ });
704
+ return dedupedEntries.slice();
705
+ }
706
+ async getSessionSummaryFromFile(sessionId, projectId, filePath, options) {
707
+ return this.buildSessionSummaryFromStream(sessionId, projectId, filePath, options);
708
+ }
709
+ async buildSessionSummaryFromStream(sessionId, projectId, filePath, options) {
710
+ const stats = await stat(filePath);
711
+ return this.buildSessionSummaryFromKnownStats(sessionId, projectId, filePath, stats, options);
712
+ }
713
+ async buildSessionSummaryFromKnownStats(sessionId, projectId, filePath, stats, options) {
714
+ const read = await this.readSummaryStream(sessionId, filePath, stats, options?.readMode ?? "full");
715
+ return this.buildSessionSummaryFromState(sessionId, projectId, stats, read.state);
716
+ }
717
+ async getCoalescedFullSessionSummary(filePath, stats, parse) {
718
+ const cacheKey = getCodexFullSummaryCacheKey(filePath, stats);
719
+ const cached = codexFullSummaryCache.get(cacheKey);
720
+ if (cached) {
721
+ cached.lastAccessedAt = Date.now();
722
+ return cloneSessionSummary(await cached.promise);
723
+ }
724
+ const promise = parse();
725
+ codexFullSummaryCache.set(cacheKey, {
726
+ promise,
727
+ lastAccessedAt: Date.now(),
319
728
  });
320
- return entries;
729
+ trimCodexFullSummaryCache();
730
+ try {
731
+ return cloneSessionSummary(await promise);
732
+ }
733
+ catch (error) {
734
+ if (codexFullSummaryCache.get(cacheKey)?.promise === promise) {
735
+ codexFullSummaryCache.delete(cacheKey);
736
+ }
737
+ throw error;
738
+ }
739
+ }
740
+ getSummaryParserClient() {
741
+ this.summaryParserClient ??= new SummaryParserClient({
742
+ mode: this.summaryParserWorkerMode,
743
+ });
744
+ return this.summaryParserClient;
745
+ }
746
+ async readSummaryStream(sessionId, filePath, stats, readMode) {
747
+ const startedAt = Date.now();
748
+ const memoryBefore = process.memoryUsage();
749
+ const state = {
750
+ sawResponseItemUser: false,
751
+ eventUserMessageCount: 0,
752
+ responseMessageCount: 0,
753
+ };
754
+ const seenDedupeKeys = new Set();
755
+ let lineCount = 0;
756
+ let parsedEntries = 0;
757
+ let dedupedEntries = 0;
758
+ let skippedDuplicateEntries = 0;
759
+ let maxLineLength = 0;
760
+ let bytesRead = 0;
761
+ let stoppedEarly = false;
762
+ let stopReason = "eof";
763
+ const parseStartedAt = Date.now();
764
+ const headBudgetStopReason = () => {
765
+ if (readMode !== "head")
766
+ return null;
767
+ if (lineCount >= CODEX_HEAD_SUMMARY_MAX_LINES) {
768
+ return "line_budget";
769
+ }
770
+ if (bytesRead >= CODEX_HEAD_SUMMARY_MAX_BYTES) {
771
+ return "byte_budget";
772
+ }
773
+ return null;
774
+ };
775
+ const stopEarly = (reason) => {
776
+ stoppedEarly = true;
777
+ stopReason = reason;
778
+ };
779
+ for await (const line of iterateJsonlLines(filePath)) {
780
+ lineCount += 1;
781
+ maxLineLength = Math.max(maxLineLength, line.length);
782
+ bytesRead += Buffer.byteLength(line) + 1;
783
+ const trimmed = line.trim();
784
+ if (!trimmed) {
785
+ const budgetReason = headBudgetStopReason();
786
+ if (budgetReason) {
787
+ stopEarly(budgetReason);
788
+ break;
789
+ }
790
+ continue;
791
+ }
792
+ const entry = parseCodexSessionEntry(trimmed);
793
+ if (!entry) {
794
+ const budgetReason = headBudgetStopReason();
795
+ if (budgetReason) {
796
+ stopEarly(budgetReason);
797
+ break;
798
+ }
799
+ continue;
800
+ }
801
+ parsedEntries += 1;
802
+ const dedupeKey = getCodexSummaryDedupeKey(entry);
803
+ if (dedupeKey) {
804
+ if (seenDedupeKeys.has(dedupeKey)) {
805
+ skippedDuplicateEntries += 1;
806
+ continue;
807
+ }
808
+ seenDedupeKeys.add(dedupeKey);
809
+ }
810
+ dedupedEntries += 1;
811
+ this.applySummaryEntry(state, entry);
812
+ if (readMode === "head" && this.hasHeadSummary(state)) {
813
+ stopEarly("head_complete");
814
+ break;
815
+ }
816
+ const budgetReason = headBudgetStopReason();
817
+ if (budgetReason) {
818
+ stopEarly(budgetReason);
819
+ break;
820
+ }
821
+ }
822
+ const parseMs = Date.now() - parseStartedAt;
823
+ const read = {
824
+ state,
825
+ lineCount,
826
+ parsedEntries,
827
+ dedupedEntries,
828
+ skippedDuplicateEntries,
829
+ maxLineLength,
830
+ parseMs,
831
+ readMode,
832
+ stoppedEarly,
833
+ stopReason,
834
+ };
835
+ this.recordSummaryStreamMetrics({
836
+ startedAt,
837
+ memoryBefore,
838
+ sessionId,
839
+ filePath,
840
+ stats,
841
+ read,
842
+ });
843
+ return read;
844
+ }
845
+ hasHeadSummary(state) {
846
+ return !!(state.metaEntry &&
847
+ (state.firstResponseUserTitle || state.firstEventUserTitle));
848
+ }
849
+ applySummaryEntry(state, entry) {
850
+ if (entry.type === "session_meta") {
851
+ state.metaEntry ??= entry;
852
+ return;
853
+ }
854
+ if (entry.type === "turn_context") {
855
+ state.firstTurnContext ??= entry;
856
+ if (entry.payload.model) {
857
+ state.model = entry.payload.model;
858
+ }
859
+ return;
860
+ }
861
+ if (entry.type === "event_msg") {
862
+ if (entry.payload.type === "user_message") {
863
+ state.eventUserMessageCount += 1;
864
+ if (!state.firstEventUserTitle) {
865
+ const fullTitle = entry.payload.message.trim();
866
+ if (!this.isSystemPromptUserMessage(fullTitle)) {
867
+ state.firstEventUserTitle = {
868
+ title: truncateSessionTitle(fullTitle) || null,
869
+ fullTitle,
870
+ };
871
+ }
872
+ }
873
+ return;
874
+ }
875
+ if (entry.payload.type === "token_count") {
876
+ const info = entry.payload.info;
877
+ const usage = info?.last_token_usage ?? info?.total_token_usage;
878
+ const inputTokens = usage?.input_tokens ?? 0;
879
+ if (inputTokens > 0) {
880
+ state.contextCandidate = {
881
+ inputTokens,
882
+ ...(info?.model_context_window && info.model_context_window > 0
883
+ ? { contextWindow: info.model_context_window }
884
+ : {}),
885
+ };
886
+ }
887
+ }
888
+ return;
889
+ }
890
+ if (entry.type !== "response_item") {
891
+ return;
892
+ }
893
+ const payload = entry.payload;
894
+ if (payload.type !== "message") {
895
+ return;
896
+ }
897
+ if (payload.role === "user" || payload.role === "assistant") {
898
+ state.responseMessageCount += 1;
899
+ }
900
+ if (payload.role !== "user") {
901
+ return;
902
+ }
903
+ state.sawResponseItemUser = true;
904
+ if (state.firstResponseUserTitle) {
905
+ return;
906
+ }
907
+ const fullTitle = payload.content
908
+ .map((content) => "text" in content && typeof content.text === "string"
909
+ ? content.text
910
+ : "")
911
+ .join("\n")
912
+ .trim();
913
+ if (fullTitle && !this.isSystemPromptUserMessage(fullTitle)) {
914
+ state.firstResponseUserTitle = {
915
+ title: truncateSessionTitle(fullTitle) || null,
916
+ fullTitle,
917
+ };
918
+ }
919
+ }
920
+ buildSessionSummaryFromState(sessionId, projectId, stats, state) {
921
+ const metaEntry = state.metaEntry;
922
+ if (!metaEntry)
923
+ return null;
924
+ const messageCount = state.responseMessageCount +
925
+ (state.sawResponseItemUser ? 0 : state.eventUserMessageCount);
926
+ if (messageCount === 0)
927
+ return null;
928
+ const model = state.model;
929
+ const provider = this.determineProvider(metaEntry, model);
930
+ const contextUsage = this.contextUsageFromSummaryCandidate(state.contextCandidate, model, provider);
931
+ const title = (state.sawResponseItemUser
932
+ ? state.firstResponseUserTitle
933
+ : state.firstEventUserTitle) ?? {
934
+ title: null,
935
+ fullTitle: null,
936
+ };
937
+ const parentSessionId = typeof metaEntry.payload.forked_from_id === "string"
938
+ ? metaEntry.payload.forked_from_id
939
+ : undefined;
940
+ return {
941
+ id: sessionId,
942
+ projectId,
943
+ title: title.title,
944
+ fullTitle: title.fullTitle,
945
+ createdAt: metaEntry.payload.timestamp,
946
+ updatedAt: stats.mtime.toISOString(),
947
+ messageCount,
948
+ ownership: { owner: "none" },
949
+ contextUsage,
950
+ provider,
951
+ model,
952
+ parentSessionId,
953
+ originator: metaEntry.payload.originator,
954
+ cliVersion: metaEntry.payload.cli_version,
955
+ source: codexSessionSourceLabel(metaEntry.payload.source),
956
+ approvalPolicy: state.firstTurnContext?.payload.approval_policy,
957
+ sandboxPolicy: state.firstTurnContext?.payload.sandbox_policy
958
+ ? {
959
+ type: state.firstTurnContext.payload.sandbox_policy.type,
960
+ networkAccess: state.firstTurnContext.payload.sandbox_policy.network_access,
961
+ excludeTmpdirEnvVar: state.firstTurnContext.payload.sandbox_policy
962
+ .exclude_tmpdir_env_var,
963
+ excludeSlashTmp: state.firstTurnContext.payload.sandbox_policy.exclude_slash_tmp,
964
+ }
965
+ : undefined,
966
+ };
967
+ }
968
+ contextUsageFromSummaryCandidate(candidate, model, provider) {
969
+ if (!candidate) {
970
+ return undefined;
971
+ }
972
+ const contextWindow = candidate.contextWindow ?? getModelContextWindow(model, provider);
973
+ const percentage = Math.min(100, Math.round((candidate.inputTokens / contextWindow) * 100));
974
+ return {
975
+ inputTokens: candidate.inputTokens,
976
+ percentage,
977
+ contextWindow,
978
+ };
979
+ }
980
+ async buildSessionSummaryFromEntries(sessionId, projectId, sessionFile, entries) {
981
+ if (entries.length === 0)
982
+ return null;
983
+ const metaEntry = entries.find((e) => e.type === "session_meta");
984
+ if (!metaEntry)
985
+ return null;
986
+ const stats = await stat(sessionFile.filePath);
987
+ const { title, fullTitle } = this.extractTitle(entries);
988
+ const messageCount = this.countMessages(entries);
989
+ const model = this.extractModel(entries);
990
+ const provider = this.determineProvider(metaEntry, model);
991
+ const turnContext = this.extractTurnContext(entries);
992
+ const contextUsage = this.extractContextUsage(entries, model, provider);
993
+ const parentSessionId = typeof metaEntry.payload.forked_from_id === "string"
994
+ ? metaEntry.payload.forked_from_id
995
+ : undefined;
996
+ if (messageCount === 0)
997
+ return null;
998
+ return {
999
+ id: sessionId,
1000
+ projectId,
1001
+ title,
1002
+ fullTitle,
1003
+ createdAt: metaEntry.payload.timestamp,
1004
+ updatedAt: stats.mtime.toISOString(),
1005
+ messageCount,
1006
+ ownership: { owner: "none" },
1007
+ contextUsage,
1008
+ provider,
1009
+ model,
1010
+ parentSessionId,
1011
+ originator: metaEntry.payload.originator,
1012
+ cliVersion: metaEntry.payload.cli_version,
1013
+ source: codexSessionSourceLabel(metaEntry.payload.source),
1014
+ approvalPolicy: turnContext?.payload.approval_policy,
1015
+ sandboxPolicy: turnContext?.payload.sandbox_policy
1016
+ ? {
1017
+ type: turnContext.payload.sandbox_policy.type,
1018
+ networkAccess: turnContext.payload.sandbox_policy.network_access,
1019
+ excludeTmpdirEnvVar: turnContext.payload.sandbox_policy.exclude_tmpdir_env_var,
1020
+ excludeSlashTmp: turnContext.payload.sandbox_policy.exclude_slash_tmp,
1021
+ }
1022
+ : undefined,
1023
+ };
1024
+ }
1025
+ recordEntryReadMetrics(options) {
1026
+ const durationMs = Date.now() - options.startedAt;
1027
+ if (!LOG_ENTRY_READS && durationMs < this.slowLogThresholdMs) {
1028
+ return;
1029
+ }
1030
+ const memoryAfter = process.memoryUsage();
1031
+ const payload = {
1032
+ event: "codex_entry_read",
1033
+ sessionsDir: this.sessionsDir,
1034
+ ...(this.projectPath ? { projectPath: this.projectPath } : {}),
1035
+ sessionId: options.sessionId,
1036
+ filePath: options.filePath,
1037
+ purpose: options.purpose,
1038
+ cacheMode: options.cacheMode,
1039
+ cacheStatus: options.cacheStatus,
1040
+ fileSize: Number(options.stats.size),
1041
+ fileMtimeMs: Number(options.stats.mtimeMs),
1042
+ durationMs,
1043
+ ...(options.readLinesMs !== undefined
1044
+ ? { readLinesMs: options.readLinesMs }
1045
+ : {}),
1046
+ ...(options.parseMs !== undefined ? { parseMs: options.parseMs } : {}),
1047
+ ...(options.dedupeMs !== undefined
1048
+ ? { dedupeMs: options.dedupeMs }
1049
+ : {}),
1050
+ ...(options.cacheStoreMs !== undefined
1051
+ ? { cacheStoreMs: options.cacheStoreMs }
1052
+ : {}),
1053
+ ...(options.lineCount !== undefined
1054
+ ? { lineCount: options.lineCount }
1055
+ : {}),
1056
+ ...(options.parsedEntries !== undefined
1057
+ ? { parsedEntries: options.parsedEntries }
1058
+ : {}),
1059
+ ...(options.dedupedEntries !== undefined
1060
+ ? { dedupedEntries: options.dedupedEntries }
1061
+ : {}),
1062
+ ...(options.maxLineLength !== undefined
1063
+ ? { maxLineLength: options.maxLineLength }
1064
+ : {}),
1065
+ heapUsedBefore: options.memoryBefore.heapUsed,
1066
+ heapUsedAfter: memoryAfter.heapUsed,
1067
+ rssBefore: options.memoryBefore.rss,
1068
+ rssAfter: memoryAfter.rss,
1069
+ heapUsedDelta: memoryAfter.heapUsed - options.memoryBefore.heapUsed,
1070
+ rssDelta: memoryAfter.rss - options.memoryBefore.rss,
1071
+ entryCache: this.getEntryCacheStats(),
1072
+ };
1073
+ if (durationMs >= this.slowLogThresholdMs) {
1074
+ getLogger().warn(payload, "CODEX_READER: slow entry read");
1075
+ return;
1076
+ }
1077
+ getLogger().debug(payload, "CODEX_READER: entry read");
1078
+ }
1079
+ recordSummaryStreamMetrics(options) {
1080
+ const durationMs = Date.now() - options.startedAt;
1081
+ const memoryAfter = process.memoryUsage();
1082
+ const payload = {
1083
+ event: "codex_summary_stream",
1084
+ sessionsDir: this.sessionsDir,
1085
+ ...(this.projectPath ? { projectPath: this.projectPath } : {}),
1086
+ sessionId: options.sessionId,
1087
+ filePath: options.filePath,
1088
+ fileSize: Number(options.stats.size),
1089
+ fileMtimeMs: Number(options.stats.mtimeMs),
1090
+ compressed: isCompressedCodexSessionFile(options.filePath),
1091
+ durationMs,
1092
+ parseMs: options.read.parseMs,
1093
+ lineCount: options.read.lineCount,
1094
+ parsedEntries: options.read.parsedEntries,
1095
+ dedupedEntries: options.read.dedupedEntries,
1096
+ skippedDuplicateEntries: options.read.skippedDuplicateEntries,
1097
+ maxLineLength: options.read.maxLineLength,
1098
+ readMode: options.read.readMode,
1099
+ stoppedEarly: options.read.stoppedEarly,
1100
+ stopReason: options.read.stopReason,
1101
+ heapUsedBefore: options.memoryBefore.heapUsed,
1102
+ heapUsedAfter: memoryAfter.heapUsed,
1103
+ rssBefore: options.memoryBefore.rss,
1104
+ rssAfter: memoryAfter.rss,
1105
+ heapUsedDelta: memoryAfter.heapUsed - options.memoryBefore.heapUsed,
1106
+ rssDelta: memoryAfter.rss - options.memoryBefore.rss,
1107
+ entryCache: this.getEntryCacheStats(),
1108
+ };
1109
+ this.lastSummaryStreamMetrics = payload;
1110
+ if (!LOG_ENTRY_READS && durationMs < this.slowLogThresholdMs) {
1111
+ return;
1112
+ }
1113
+ if (durationMs >= this.slowLogThresholdMs) {
1114
+ getLogger().warn(payload, "CODEX_READER: slow summary stream");
1115
+ return;
1116
+ }
1117
+ getLogger().debug(payload, "CODEX_READER: summary stream");
321
1118
  }
322
1119
  async readFileRange(filePath, start, length) {
323
1120
  if (length <= 0) {
@@ -334,70 +1131,79 @@ export class CodexSessionReader {
334
1131
  }
335
1132
  }
336
1133
  /**
337
- * Recursively find all .jsonl files in a directory.
1134
+ * Recursively find all Codex rollout files in a directory.
338
1135
  */
339
- async findJsonlFiles(dir) {
1136
+ async findJsonlFiles(dir, metrics) {
340
1137
  const files = [];
1138
+ await this.collectJsonlFiles(dir, files, metrics);
1139
+ const preferredFiles = preferPlainCodexRollouts(files);
1140
+ if (metrics) {
1141
+ metrics.rolloutFilesAfterPrecedence = preferredFiles.length;
1142
+ metrics.precedenceSkippedCompressed =
1143
+ files.length - preferredFiles.length;
1144
+ }
1145
+ return preferredFiles;
1146
+ }
1147
+ async collectJsonlFiles(dir, files, metrics) {
341
1148
  try {
1149
+ if (metrics)
1150
+ metrics.directoriesVisited += 1;
342
1151
  const entries = await readdir(dir, { withFileTypes: true });
343
1152
  for (const entry of entries) {
344
1153
  const fullPath = join(dir, entry.name);
345
1154
  if (entry.isDirectory()) {
346
- const subFiles = await this.findJsonlFiles(fullPath);
347
- files.push(...subFiles);
1155
+ await this.collectJsonlFiles(fullPath, files, metrics);
348
1156
  }
349
- else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
1157
+ else if (entry.isFile() && isCodexRolloutFileName(entry.name)) {
350
1158
  files.push(fullPath);
1159
+ if (metrics) {
1160
+ metrics.rolloutFilesFound += 1;
1161
+ if (codexRolloutRepresentation(fullPath) === "zstd") {
1162
+ metrics.compressedRolloutFiles += 1;
1163
+ }
1164
+ else {
1165
+ metrics.plainRolloutFiles += 1;
1166
+ }
1167
+ }
351
1168
  }
352
1169
  }
353
1170
  }
354
1171
  catch {
1172
+ if (metrics)
1173
+ metrics.directoryReadErrors += 1;
355
1174
  // Ignore errors (permission denied, etc.)
356
1175
  }
357
- return files;
358
1176
  }
359
1177
  /**
360
1178
  * Read session metadata from the first line of a file.
361
1179
  */
362
- async readSessionMeta(filePath, options) {
1180
+ async readSessionMeta(filePath, options, metrics) {
363
1181
  try {
364
- const stats = await stat(filePath);
365
- if (options?.activeAfterMs && stats.mtimeMs < options.activeAfterMs) {
366
- return null;
367
- }
368
- const firstLine = await readFirstLine(filePath, CODEX_META_READ_MAX_BYTES);
369
- if (!firstLine)
370
- return null;
371
- const entry = parseCodexSessionEntry(firstLine);
372
- if (entry?.type !== "session_meta")
1182
+ const session = await readCodexRolloutMetadata({
1183
+ sessionsDir: this.sessionsDir,
1184
+ filePath,
1185
+ ...(this.discoveryIndex ? { discoveryIndex: this.discoveryIndex } : {}),
1186
+ ...(options?.activeAfterMs !== undefined
1187
+ ? { activeAfterMs: options.activeAfterMs }
1188
+ : {}),
1189
+ ...(metrics ? { metrics: metrics.discovery } : {}),
1190
+ });
1191
+ if (!session)
373
1192
  return null;
374
- const meta = entry.payload;
375
1193
  return {
376
- id: meta.id,
1194
+ id: session.id,
377
1195
  filePath,
378
- cwd: meta.cwd,
379
- timestamp: meta.timestamp,
380
- mtime: stats.mtimeMs,
381
- size: stats.size,
382
- isSubagent: this.isSubagentSessionMeta(meta),
1196
+ cwd: session.cwd,
1197
+ timestamp: session.timestamp,
1198
+ mtime: session.mtime,
1199
+ size: session.size,
1200
+ isSubagent: session.isSubagent,
383
1201
  };
384
1202
  }
385
1203
  catch {
386
1204
  return null;
387
1205
  }
388
1206
  }
389
- isSubagentSessionMeta(meta) {
390
- if (!("forked_from_id" in meta) ||
391
- typeof meta.forked_from_id !== "string") {
392
- return false;
393
- }
394
- const source = meta.source;
395
- if (!source || typeof source !== "object")
396
- return false;
397
- const subagentSource = source;
398
- return (typeof subagentSource.subagent?.thread_spawn?.parent_thread_id ===
399
- "string");
400
- }
401
1207
  /**
402
1208
  * Extract title from entries (first user message).
403
1209
  */
@@ -506,9 +1312,11 @@ export class CodexSessionReader {
506
1312
  * Extract the model from turn_context entries.
507
1313
  */
508
1314
  extractModel(entries) {
509
- // Find first turn_context entry with a model
510
- for (const entry of entries) {
511
- if (entry.type === "turn_context" && entry.payload.model) {
1315
+ // Last turn_context with a model: per-turn context tracks the model the
1316
+ // session is currently using, which can change mid-transcript.
1317
+ for (let i = entries.length - 1; i >= 0; i--) {
1318
+ const entry = entries[i];
1319
+ if (entry?.type === "turn_context" && entry.payload.model) {
512
1320
  return entry.payload.model;
513
1321
  }
514
1322
  }
@@ -579,4 +1387,124 @@ export class CodexSessionReader {
579
1387
  entry.payload.role === "user");
580
1388
  }
581
1389
  }
1390
+ function createCodexSessionReaderScanMetrics(options) {
1391
+ return {
1392
+ sessionsDir: options.sessionsDir,
1393
+ ...(options.projectPath ? { projectPath: options.projectPath } : {}),
1394
+ ...(options.activeAfterMs !== undefined
1395
+ ? { activeAfterMs: options.activeAfterMs }
1396
+ : {}),
1397
+ cacheKey: options.cacheKey,
1398
+ sharedCacheStatus: options.sharedCacheStatus,
1399
+ durationMs: 0,
1400
+ sessionsDirExists: false,
1401
+ directoriesVisited: 0,
1402
+ directoryReadErrors: 0,
1403
+ rolloutFilesFound: 0,
1404
+ rolloutFilesAfterPrecedence: 0,
1405
+ plainRolloutFiles: 0,
1406
+ compressedRolloutFiles: 0,
1407
+ precedenceSkippedCompressed: 0,
1408
+ sessionsParsed: 0,
1409
+ failedFiles: 0,
1410
+ subagentSessionsSkipped: 0,
1411
+ sessionsReturned: 0,
1412
+ discovery: createCodexRolloutDiscoveryStats(),
1413
+ };
1414
+ }
1415
+ function codexSessionSourceLabel(source) {
1416
+ if (typeof source === "string") {
1417
+ const trimmed = source.trim();
1418
+ return trimmed || undefined;
1419
+ }
1420
+ if (isRecord(source) && isRecord(source.subagent)) {
1421
+ return "subagent";
1422
+ }
1423
+ return undefined;
1424
+ }
1425
+ function parseCodexSpawnAgentOutput(output) {
1426
+ const text = codexToolOutputText(output);
1427
+ if (!text) {
1428
+ return null;
1429
+ }
1430
+ const parsed = parseJsonRecord(text);
1431
+ const agentId = stringField(parsed, "agent_id") ?? stringField(parsed, "agentId");
1432
+ if (agentId) {
1433
+ return agentId;
1434
+ }
1435
+ return (text.match(/"agent_id"\s*:\s*"([^"]+)"/)?.[1] ??
1436
+ text.match(/"agentId"\s*:\s*"([^"]+)"/)?.[1] ??
1437
+ null);
1438
+ }
1439
+ function codexToolOutputText(output) {
1440
+ if (typeof output === "string") {
1441
+ return output.trim();
1442
+ }
1443
+ if (!Array.isArray(output)) {
1444
+ return "";
1445
+ }
1446
+ return output
1447
+ .map((item) => isRecord(item) && typeof item.text === "string" ? item.text : "")
1448
+ .filter(Boolean)
1449
+ .join("\n")
1450
+ .trim();
1451
+ }
1452
+ function parseJsonRecord(text) {
1453
+ try {
1454
+ const parsed = JSON.parse(text);
1455
+ return isRecord(parsed) ? parsed : null;
1456
+ }
1457
+ catch {
1458
+ return null;
1459
+ }
1460
+ }
1461
+ function stringField(record, field) {
1462
+ const value = record?.[field];
1463
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
1464
+ }
1465
+ function inferCodexAgentStatus(entries) {
1466
+ let sawTaskStarted = false;
1467
+ let sawTaskComplete = false;
1468
+ let sawTurnAborted = false;
1469
+ let sawAssistantMessage = false;
1470
+ for (const entry of entries) {
1471
+ if (entry.type === "event_msg") {
1472
+ if (entry.payload.type === "task_started") {
1473
+ sawTaskStarted = true;
1474
+ sawTaskComplete = false;
1475
+ }
1476
+ else if (entry.payload.type === "task_complete") {
1477
+ sawTaskComplete = true;
1478
+ }
1479
+ else if (entry.payload.type === "turn_aborted") {
1480
+ sawTurnAborted = true;
1481
+ }
1482
+ continue;
1483
+ }
1484
+ if (entry.type === "response_item" &&
1485
+ entry.payload.type === "message" &&
1486
+ entry.payload.role === "assistant") {
1487
+ sawAssistantMessage = true;
1488
+ }
1489
+ }
1490
+ if (sawTurnAborted) {
1491
+ return "failed";
1492
+ }
1493
+ if (sawTaskStarted && !sawTaskComplete) {
1494
+ return "running";
1495
+ }
1496
+ if (sawTaskComplete || sawAssistantMessage) {
1497
+ return "completed";
1498
+ }
1499
+ return "pending";
1500
+ }
1501
+ function isRecord(value) {
1502
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1503
+ }
1504
+ function cloneCodexSessionReaderScanMetrics(metrics) {
1505
+ return {
1506
+ ...metrics,
1507
+ discovery: { ...metrics.discovery },
1508
+ };
1509
+ }
582
1510
  //# sourceMappingURL=codex-reader.js.map