@ck123pm/paseo-server 0.1.80

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 (1077) hide show
  1. package/.env.example +23 -0
  2. package/README.md +111 -0
  3. package/dist/scripts/dev-runner.js +49 -0
  4. package/dist/scripts/dev-runner.js.map +1 -0
  5. package/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  6. package/dist/scripts/supervisor-entrypoint.js +126 -0
  7. package/dist/scripts/supervisor-entrypoint.js.map +1 -0
  8. package/dist/scripts/supervisor-log-config.js +31 -0
  9. package/dist/scripts/supervisor-log-config.js.map +1 -0
  10. package/dist/scripts/supervisor.js +213 -0
  11. package/dist/scripts/supervisor.js.map +1 -0
  12. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts +8 -0
  13. package/dist/server/client/daemon-client-relay-e2ee-transport.d.ts.map +1 -0
  14. package/dist/server/client/daemon-client-relay-e2ee-transport.js +161 -0
  15. package/dist/server/client/daemon-client-relay-e2ee-transport.js.map +1 -0
  16. package/dist/server/client/daemon-client-runtime-metrics.d.ts +39 -0
  17. package/dist/server/client/daemon-client-runtime-metrics.d.ts.map +1 -0
  18. package/dist/server/client/daemon-client-runtime-metrics.js +173 -0
  19. package/dist/server/client/daemon-client-runtime-metrics.js.map +1 -0
  20. package/dist/server/client/daemon-client-transport-types.d.ts +36 -0
  21. package/dist/server/client/daemon-client-transport-types.d.ts.map +1 -0
  22. package/dist/server/client/daemon-client-transport-types.js +2 -0
  23. package/dist/server/client/daemon-client-transport-types.js.map +1 -0
  24. package/dist/server/client/daemon-client-transport-utils.d.ts +9 -0
  25. package/dist/server/client/daemon-client-transport-utils.d.ts.map +1 -0
  26. package/dist/server/client/daemon-client-transport-utils.js +121 -0
  27. package/dist/server/client/daemon-client-transport-utils.js.map +1 -0
  28. package/dist/server/client/daemon-client-transport.d.ts +5 -0
  29. package/dist/server/client/daemon-client-transport.d.ts.map +1 -0
  30. package/dist/server/client/daemon-client-transport.js +4 -0
  31. package/dist/server/client/daemon-client-transport.js.map +1 -0
  32. package/dist/server/client/daemon-client-websocket-transport.d.ts +8 -0
  33. package/dist/server/client/daemon-client-websocket-transport.d.ts.map +1 -0
  34. package/dist/server/client/daemon-client-websocket-transport.js +120 -0
  35. package/dist/server/client/daemon-client-websocket-transport.js.map +1 -0
  36. package/dist/server/client/daemon-client.d.ts +862 -0
  37. package/dist/server/client/daemon-client.d.ts.map +1 -0
  38. package/dist/server/client/daemon-client.js +3376 -0
  39. package/dist/server/client/daemon-client.js.map +1 -0
  40. package/dist/server/client/terminal-stream-router.d.ts +24 -0
  41. package/dist/server/client/terminal-stream-router.d.ts.map +1 -0
  42. package/dist/server/client/terminal-stream-router.js +100 -0
  43. package/dist/server/client/terminal-stream-router.js.map +1 -0
  44. package/dist/server/server/agent/activity-curator.d.ts +11 -0
  45. package/dist/server/server/agent/activity-curator.d.ts.map +1 -0
  46. package/dist/server/server/agent/activity-curator.js +150 -0
  47. package/dist/server/server/agent/activity-curator.js.map +1 -0
  48. package/dist/server/server/agent/agent-archive.d.ts +11 -0
  49. package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
  50. package/dist/server/server/agent/agent-archive.js +16 -0
  51. package/dist/server/server/agent/agent-archive.js.map +1 -0
  52. package/dist/server/server/agent/agent-loading.d.ts +12 -0
  53. package/dist/server/server/agent/agent-loading.d.ts.map +1 -0
  54. package/dist/server/server/agent/agent-loading.js +51 -0
  55. package/dist/server/server/agent/agent-loading.js.map +1 -0
  56. package/dist/server/server/agent/agent-manager.d.ts +342 -0
  57. package/dist/server/server/agent/agent-manager.d.ts.map +1 -0
  58. package/dist/server/server/agent/agent-manager.js +2572 -0
  59. package/dist/server/server/agent/agent-manager.js.map +1 -0
  60. package/dist/server/server/agent/agent-metadata-generator.d.ts +27 -0
  61. package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -0
  62. package/dist/server/server/agent/agent-metadata-generator.js +104 -0
  63. package/dist/server/server/agent/agent-metadata-generator.js.map +1 -0
  64. package/dist/server/server/agent/agent-projections.d.ts +24 -0
  65. package/dist/server/server/agent/agent-projections.d.ts.map +1 -0
  66. package/dist/server/server/agent/agent-projections.js +406 -0
  67. package/dist/server/server/agent/agent-projections.js.map +1 -0
  68. package/dist/server/server/agent/agent-prompt.d.ts +72 -0
  69. package/dist/server/server/agent/agent-prompt.d.ts.map +1 -0
  70. package/dist/server/server/agent/agent-prompt.js +196 -0
  71. package/dist/server/server/agent/agent-prompt.js.map +1 -0
  72. package/dist/server/server/agent/agent-response-loop.d.ts +62 -0
  73. package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -0
  74. package/dist/server/server/agent/agent-response-loop.js +321 -0
  75. package/dist/server/server/agent/agent-response-loop.js.map +1 -0
  76. package/dist/server/server/agent/agent-sdk-types.d.ts +540 -0
  77. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -0
  78. package/dist/server/server/agent/agent-sdk-types.js +22 -0
  79. package/dist/server/server/agent/agent-sdk-types.js.map +1 -0
  80. package/dist/server/server/agent/agent-storage.d.ts +346 -0
  81. package/dist/server/server/agent/agent-storage.d.ts.map +1 -0
  82. package/dist/server/server/agent/agent-storage.js +340 -0
  83. package/dist/server/server/agent/agent-storage.js.map +1 -0
  84. package/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  85. package/dist/server/server/agent/agent-stream-coalescer.d.ts.map +1 -0
  86. package/dist/server/server/agent/agent-stream-coalescer.js +166 -0
  87. package/dist/server/server/agent/agent-stream-coalescer.js.map +1 -0
  88. package/dist/server/server/agent/agent-timeline-store-types.d.ts +54 -0
  89. package/dist/server/server/agent/agent-timeline-store-types.d.ts.map +1 -0
  90. package/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  91. package/dist/server/server/agent/agent-timeline-store-types.js.map +1 -0
  92. package/dist/server/server/agent/agent-timeline-store.d.ts +32 -0
  93. package/dist/server/server/agent/agent-timeline-store.d.ts.map +1 -0
  94. package/dist/server/server/agent/agent-timeline-store.js +263 -0
  95. package/dist/server/server/agent/agent-timeline-store.js.map +1 -0
  96. package/dist/server/server/agent/agent-title-limits.d.ts +3 -0
  97. package/dist/server/server/agent/agent-title-limits.d.ts.map +1 -0
  98. package/dist/server/server/agent/agent-title-limits.js +3 -0
  99. package/dist/server/server/agent/agent-title-limits.js.map +1 -0
  100. package/dist/server/server/agent/audio-utils.d.ts +3 -0
  101. package/dist/server/server/agent/audio-utils.d.ts.map +1 -0
  102. package/dist/server/server/agent/audio-utils.js +19 -0
  103. package/dist/server/server/agent/audio-utils.js.map +1 -0
  104. package/dist/server/server/agent/create-agent-mode.d.ts +16 -0
  105. package/dist/server/server/agent/create-agent-mode.d.ts.map +1 -0
  106. package/dist/server/server/agent/create-agent-mode.js +26 -0
  107. package/dist/server/server/agent/create-agent-mode.js.map +1 -0
  108. package/dist/server/server/agent/create-agent-title.d.ts +8 -0
  109. package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
  110. package/dist/server/server/agent/create-agent-title.js +29 -0
  111. package/dist/server/server/agent/create-agent-title.js.map +1 -0
  112. package/dist/server/server/agent/dictation-debug.d.ts +13 -0
  113. package/dist/server/server/agent/dictation-debug.d.ts.map +1 -0
  114. package/dist/server/server/agent/dictation-debug.js +50 -0
  115. package/dist/server/server/agent/dictation-debug.js.map +1 -0
  116. package/dist/server/server/agent/foreground-run-state.d.ts +50 -0
  117. package/dist/server/server/agent/foreground-run-state.d.ts.map +1 -0
  118. package/dist/server/server/agent/foreground-run-state.js +160 -0
  119. package/dist/server/server/agent/foreground-run-state.js.map +1 -0
  120. package/dist/server/server/agent/import-sessions.d.ts +52 -0
  121. package/dist/server/server/agent/import-sessions.d.ts.map +1 -0
  122. package/dist/server/server/agent/import-sessions.js +212 -0
  123. package/dist/server/server/agent/import-sessions.js.map +1 -0
  124. package/dist/server/server/agent/mcp-server.d.ts +46 -0
  125. package/dist/server/server/agent/mcp-server.d.ts.map +1 -0
  126. package/dist/server/server/agent/mcp-server.js +1962 -0
  127. package/dist/server/server/agent/mcp-server.js.map +1 -0
  128. package/dist/server/server/agent/mcp-shared.d.ts +316 -0
  129. package/dist/server/server/agent/mcp-shared.d.ts.map +1 -0
  130. package/dist/server/server/agent/mcp-shared.js +194 -0
  131. package/dist/server/server/agent/mcp-shared.js.map +1 -0
  132. package/dist/server/server/agent/model-resolver.d.ts +11 -0
  133. package/dist/server/server/agent/model-resolver.d.ts.map +1 -0
  134. package/dist/server/server/agent/model-resolver.js +27 -0
  135. package/dist/server/server/agent/model-resolver.js.map +1 -0
  136. package/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  137. package/dist/server/server/agent/pcm16-resampler.d.ts.map +1 -0
  138. package/dist/server/server/agent/pcm16-resampler.js +63 -0
  139. package/dist/server/server/agent/pcm16-resampler.js.map +1 -0
  140. package/dist/server/server/agent/prompt-attachments.d.ts +7 -0
  141. package/dist/server/server/agent/prompt-attachments.d.ts.map +1 -0
  142. package/dist/server/server/agent/prompt-attachments.js +72 -0
  143. package/dist/server/server/agent/prompt-attachments.js.map +1 -0
  144. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  145. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
  146. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  147. package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
  148. package/dist/server/server/agent/provider-launch-config.d.ts +368 -0
  149. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -0
  150. package/dist/server/server/agent/provider-launch-config.js +190 -0
  151. package/dist/server/server/agent/provider-launch-config.js.map +1 -0
  152. package/dist/server/server/agent/provider-manifest.d.ts +33 -0
  153. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -0
  154. package/dist/server/server/agent/provider-manifest.js +211 -0
  155. package/dist/server/server/agent/provider-manifest.js.map +1 -0
  156. package/dist/server/server/agent/provider-registry.d.ts +33 -0
  157. package/dist/server/server/agent/provider-registry.d.ts.map +1 -0
  158. package/dist/server/server/agent/provider-registry.js +396 -0
  159. package/dist/server/server/agent/provider-registry.js.map +1 -0
  160. package/dist/server/server/agent/provider-snapshot-manager.d.ts +49 -0
  161. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -0
  162. package/dist/server/server/agent/provider-snapshot-manager.js +348 -0
  163. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -0
  164. package/dist/server/server/agent/providers/acp-agent.d.ts +286 -0
  165. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -0
  166. package/dist/server/server/agent/providers/acp-agent.js +2070 -0
  167. package/dist/server/server/agent/providers/acp-agent.js.map +1 -0
  168. package/dist/server/server/agent/providers/claude/agent.d.ts +60 -0
  169. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -0
  170. package/dist/server/server/agent/providers/claude/agent.js +3815 -0
  171. package/dist/server/server/agent/providers/claude/agent.js.map +1 -0
  172. package/dist/server/server/agent/providers/claude/models.d.ts +10 -0
  173. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -0
  174. package/dist/server/server/agent/providers/claude/models.js +170 -0
  175. package/dist/server/server/agent/providers/claude/models.js.map +1 -0
  176. package/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  177. package/dist/server/server/agent/providers/claude/partial-json.d.ts.map +1 -0
  178. package/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  179. package/dist/server/server/agent/providers/claude/partial-json.js.map +1 -0
  180. package/dist/server/server/agent/providers/claude/project-dir.d.ts +5 -0
  181. package/dist/server/server/agent/providers/claude/project-dir.d.ts.map +1 -0
  182. package/dist/server/server/agent/providers/claude/project-dir.js +40 -0
  183. package/dist/server/server/agent/providers/claude/project-dir.js.map +1 -0
  184. package/dist/server/server/agent/providers/claude/query.d.ts +14 -0
  185. package/dist/server/server/agent/providers/claude/query.d.ts.map +1 -0
  186. package/dist/server/server/agent/providers/claude/query.js +84 -0
  187. package/dist/server/server/agent/providers/claude/query.js.map +1 -0
  188. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +22 -0
  189. package/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts.map +1 -0
  190. package/dist/server/server/agent/providers/claude/sidechain-tracker.js +232 -0
  191. package/dist/server/server/agent/providers/claude/sidechain-tracker.js.map +1 -0
  192. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +55 -0
  193. package/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts.map +1 -0
  194. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
  195. package/dist/server/server/agent/providers/claude/task-notification-tool-call.js.map +1 -0
  196. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  197. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -0
  198. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  199. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -0
  200. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  201. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -0
  202. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  203. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -0
  204. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +32 -0
  205. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
  206. package/dist/server/server/agent/providers/codex/app-server-transport.js +214 -0
  207. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
  208. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
  209. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
  210. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
  211. package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
  212. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  213. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts.map +1 -0
  214. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  215. package/dist/server/server/agent/providers/codex/tool-call-detail-parser.js.map +1 -0
  216. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +15 -0
  217. package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -0
  218. package/dist/server/server/agent/providers/codex/tool-call-mapper.js +791 -0
  219. package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -0
  220. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +307 -0
  221. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -0
  222. package/dist/server/server/agent/providers/codex-app-server-agent.js +4364 -0
  223. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -0
  224. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  225. package/dist/server/server/agent/providers/codex-feature-definitions.d.ts.map +1 -0
  226. package/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  227. package/dist/server/server/agent/providers/codex-feature-definitions.js.map +1 -0
  228. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts +9 -0
  229. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -0
  230. package/dist/server/server/agent/providers/codex-rollout-timeline.js +555 -0
  231. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -0
  232. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts +25 -0
  233. package/dist/server/server/agent/providers/copilot-acp-agent.d.ts.map +1 -0
  234. package/dist/server/server/agent/providers/copilot-acp-agent.js +203 -0
  235. package/dist/server/server/agent/providers/copilot-acp-agent.js.map +1 -0
  236. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
  237. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
  238. package/dist/server/server/agent/providers/cursor-acp-agent.js +95 -0
  239. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
  240. package/dist/server/server/agent/providers/diagnostic-utils.d.ts +17 -0
  241. package/dist/server/server/agent/providers/diagnostic-utils.d.ts.map +1 -0
  242. package/dist/server/server/agent/providers/diagnostic-utils.js +127 -0
  243. package/dist/server/server/agent/providers/diagnostic-utils.js.map +1 -0
  244. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +33 -0
  245. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -0
  246. package/dist/server/server/agent/providers/generic-acp-agent.js +234 -0
  247. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -0
  248. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts +68 -0
  249. package/dist/server/server/agent/providers/mock-load-test-agent.d.ts.map +1 -0
  250. package/dist/server/server/agent/providers/mock-load-test-agent.js +770 -0
  251. package/dist/server/server/agent/providers/mock-load-test-agent.js.map +1 -0
  252. package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
  253. package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
  254. package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
  255. package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
  256. package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
  257. package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
  258. package/dist/server/server/agent/providers/opencode/server-manager.js +256 -0
  259. package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
  260. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
  261. package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
  262. package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
  263. package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
  264. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +83 -0
  265. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
  266. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +225 -0
  267. package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
  268. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  269. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts.map +1 -0
  270. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +131 -0
  271. package/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js.map +1 -0
  272. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  273. package/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts.map +1 -0
  274. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  275. package/dist/server/server/agent/providers/opencode/tool-call-mapper.js.map +1 -0
  276. package/dist/server/server/agent/providers/opencode-agent.d.ts +231 -0
  277. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -0
  278. package/dist/server/server/agent/providers/opencode-agent.js +2443 -0
  279. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -0
  280. package/dist/server/server/agent/providers/pi/agent.d.ts +84 -0
  281. package/dist/server/server/agent/providers/pi/agent.d.ts.map +1 -0
  282. package/dist/server/server/agent/providers/pi/agent.js +828 -0
  283. package/dist/server/server/agent/providers/pi/agent.js.map +1 -0
  284. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts +18 -0
  285. package/dist/server/server/agent/providers/pi/cli-runtime.d.ts.map +1 -0
  286. package/dist/server/server/agent/providers/pi/cli-runtime.js +211 -0
  287. package/dist/server/server/agent/providers/pi/cli-runtime.js.map +1 -0
  288. package/dist/server/server/agent/providers/pi/history-mapper.d.ts +5 -0
  289. package/dist/server/server/agent/providers/pi/history-mapper.d.ts.map +1 -0
  290. package/dist/server/server/agent/providers/pi/history-mapper.js +139 -0
  291. package/dist/server/server/agent/providers/pi/history-mapper.js.map +1 -0
  292. package/dist/server/server/agent/providers/pi/rpc-types.d.ts +185 -0
  293. package/dist/server/server/agent/providers/pi/rpc-types.d.ts.map +1 -0
  294. package/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  295. package/dist/server/server/agent/providers/pi/rpc-types.js.map +1 -0
  296. package/dist/server/server/agent/providers/pi/runtime.d.ts +47 -0
  297. package/dist/server/server/agent/providers/pi/runtime.d.ts.map +1 -0
  298. package/dist/server/server/agent/providers/pi/runtime.js +47 -0
  299. package/dist/server/server/agent/providers/pi/runtime.js.map +1 -0
  300. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts +10 -0
  301. package/dist/server/server/agent/providers/pi/session-descriptor.d.ts.map +1 -0
  302. package/dist/server/server/agent/providers/pi/session-descriptor.js +300 -0
  303. package/dist/server/server/agent/providers/pi/session-descriptor.js.map +1 -0
  304. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +52 -0
  305. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts.map +1 -0
  306. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +109 -0
  307. package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js.map +1 -0
  308. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  309. package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts.map +1 -0
  310. package/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  311. package/dist/server/server/agent/providers/pi/tool-call-mapper.js.map +1 -0
  312. package/dist/server/server/agent/providers/provider-image-output.d.ts +20 -0
  313. package/dist/server/server/agent/providers/provider-image-output.d.ts.map +1 -0
  314. package/dist/server/server/agent/providers/provider-image-output.js +51 -0
  315. package/dist/server/server/agent/providers/provider-image-output.js.map +1 -0
  316. package/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  317. package/dist/server/server/agent/providers/provider-runner.d.ts.map +1 -0
  318. package/dist/server/server/agent/providers/provider-runner.js +81 -0
  319. package/dist/server/server/agent/providers/provider-runner.js.map +1 -0
  320. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  321. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts.map +1 -0
  322. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  323. package/dist/server/server/agent/providers/test-utils/session-stream-adapter.js.map +1 -0
  324. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +1751 -0
  325. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -0
  326. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +709 -0
  327. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -0
  328. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +20 -0
  329. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -0
  330. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +146 -0
  331. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -0
  332. package/dist/server/server/agent/recordings-debug.d.ts +3 -0
  333. package/dist/server/server/agent/recordings-debug.d.ts.map +1 -0
  334. package/dist/server/server/agent/recordings-debug.js +19 -0
  335. package/dist/server/server/agent/recordings-debug.js.map +1 -0
  336. package/dist/server/server/agent/stt-debug.d.ts +10 -0
  337. package/dist/server/server/agent/stt-debug.d.ts.map +1 -0
  338. package/dist/server/server/agent/stt-debug.js +33 -0
  339. package/dist/server/server/agent/stt-debug.js.map +1 -0
  340. package/dist/server/server/agent/stt-manager.d.ts +38 -0
  341. package/dist/server/server/agent/stt-manager.d.ts.map +1 -0
  342. package/dist/server/server/agent/stt-manager.js +246 -0
  343. package/dist/server/server/agent/stt-manager.js.map +1 -0
  344. package/dist/server/server/agent/system-prompt.d.ts +2 -0
  345. package/dist/server/server/agent/system-prompt.d.ts.map +1 -0
  346. package/dist/server/server/agent/system-prompt.js +8 -0
  347. package/dist/server/server/agent/system-prompt.js.map +1 -0
  348. package/dist/server/server/agent/timeline-append.d.ts +10 -0
  349. package/dist/server/server/agent/timeline-append.d.ts.map +1 -0
  350. package/dist/server/server/agent/timeline-append.js +27 -0
  351. package/dist/server/server/agent/timeline-append.js.map +1 -0
  352. package/dist/server/server/agent/timeline-projection.d.ts +55 -0
  353. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -0
  354. package/dist/server/server/agent/timeline-projection.js +279 -0
  355. package/dist/server/server/agent/timeline-projection.js.map +1 -0
  356. package/dist/server/server/agent/tool-name-normalization.d.ts +9 -0
  357. package/dist/server/server/agent/tool-name-normalization.d.ts.map +1 -0
  358. package/dist/server/server/agent/tool-name-normalization.js +82 -0
  359. package/dist/server/server/agent/tool-name-normalization.js.map +1 -0
  360. package/dist/server/server/agent/tts-debug.d.ts +8 -0
  361. package/dist/server/server/agent/tts-debug.d.ts.map +1 -0
  362. package/dist/server/server/agent/tts-debug.js +24 -0
  363. package/dist/server/server/agent/tts-debug.js.map +1 -0
  364. package/dist/server/server/agent/tts-manager.d.ts +41 -0
  365. package/dist/server/server/agent/tts-manager.d.ts.map +1 -0
  366. package/dist/server/server/agent/tts-manager.js +375 -0
  367. package/dist/server/server/agent/tts-manager.js.map +1 -0
  368. package/dist/server/server/agent/wait-for-agent-tracker.d.ts +15 -0
  369. package/dist/server/server/agent/wait-for-agent-tracker.d.ts.map +1 -0
  370. package/dist/server/server/agent/wait-for-agent-tracker.js +53 -0
  371. package/dist/server/server/agent/wait-for-agent-tracker.js.map +1 -0
  372. package/dist/server/server/agent-attention-policy.d.ts +20 -0
  373. package/dist/server/server/agent-attention-policy.d.ts.map +1 -0
  374. package/dist/server/server/agent-attention-policy.js +24 -0
  375. package/dist/server/server/agent-attention-policy.js.map +1 -0
  376. package/dist/server/server/auth.d.ts +25 -0
  377. package/dist/server/server/auth.d.ts.map +1 -0
  378. package/dist/server/server/auth.js +93 -0
  379. package/dist/server/server/auth.js.map +1 -0
  380. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  381. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
  382. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
  383. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
  384. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  385. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
  386. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  387. package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
  388. package/dist/server/server/bootstrap.d.ts +98 -0
  389. package/dist/server/server/bootstrap.d.ts.map +1 -0
  390. package/dist/server/server/bootstrap.js +800 -0
  391. package/dist/server/server/bootstrap.js.map +1 -0
  392. package/dist/server/server/chat/chat-mentions.d.ts +47 -0
  393. package/dist/server/server/chat/chat-mentions.d.ts.map +1 -0
  394. package/dist/server/server/chat/chat-mentions.js +113 -0
  395. package/dist/server/server/chat/chat-mentions.js.map +1 -0
  396. package/dist/server/server/chat/chat-rpc-schemas.d.ts +728 -0
  397. package/dist/server/server/chat/chat-rpc-schemas.d.ts.map +1 -0
  398. package/dist/server/server/chat/chat-rpc-schemas.js +103 -0
  399. package/dist/server/server/chat/chat-rpc-schemas.js.map +1 -0
  400. package/dist/server/server/chat/chat-service.d.ts +78 -0
  401. package/dist/server/server/chat/chat-service.d.ts.map +1 -0
  402. package/dist/server/server/chat/chat-service.js +339 -0
  403. package/dist/server/server/chat/chat-service.js.map +1 -0
  404. package/dist/server/server/chat/chat-types.d.ts +75 -0
  405. package/dist/server/server/chat/chat-types.d.ts.map +1 -0
  406. package/dist/server/server/chat/chat-types.js +22 -0
  407. package/dist/server/server/chat/chat-types.js.map +1 -0
  408. package/dist/server/server/checkout/status-projection.d.ts +19 -0
  409. package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
  410. package/dist/server/server/checkout/status-projection.js +102 -0
  411. package/dist/server/server/checkout/status-projection.js.map +1 -0
  412. package/dist/server/server/checkout-diff-manager.d.ts +41 -0
  413. package/dist/server/server/checkout-diff-manager.d.ts.map +1 -0
  414. package/dist/server/server/checkout-diff-manager.js +189 -0
  415. package/dist/server/server/checkout-diff-manager.js.map +1 -0
  416. package/dist/server/server/checkout-git-utils.d.ts +11 -0
  417. package/dist/server/server/checkout-git-utils.d.ts.map +1 -0
  418. package/dist/server/server/checkout-git-utils.js +34 -0
  419. package/dist/server/server/checkout-git-utils.js.map +1 -0
  420. package/dist/server/server/client-message-id.d.ts +3 -0
  421. package/dist/server/server/client-message-id.d.ts.map +1 -0
  422. package/dist/server/server/client-message-id.js +12 -0
  423. package/dist/server/server/client-message-id.js.map +1 -0
  424. package/dist/server/server/config.d.ts +23 -0
  425. package/dist/server/server/config.d.ts.map +1 -0
  426. package/dist/server/server/config.js +233 -0
  427. package/dist/server/server/config.js.map +1 -0
  428. package/dist/server/server/connection-offer.d.ts +20 -0
  429. package/dist/server/server/connection-offer.d.ts.map +1 -0
  430. package/dist/server/server/connection-offer.js +59 -0
  431. package/dist/server/server/connection-offer.js.map +1 -0
  432. package/dist/server/server/daemon-config-store.d.ts +25 -0
  433. package/dist/server/server/daemon-config-store.d.ts.map +1 -0
  434. package/dist/server/server/daemon-config-store.js +138 -0
  435. package/dist/server/server/daemon-config-store.js.map +1 -0
  436. package/dist/server/server/daemon-keypair.d.ts +8 -0
  437. package/dist/server/server/daemon-keypair.d.ts.map +1 -0
  438. package/dist/server/server/daemon-keypair.js +42 -0
  439. package/dist/server/server/daemon-keypair.js.map +1 -0
  440. package/dist/server/server/daemon-version.d.ts +5 -0
  441. package/dist/server/server/daemon-version.d.ts.map +1 -0
  442. package/dist/server/server/daemon-version.js +22 -0
  443. package/dist/server/server/daemon-version.js.map +1 -0
  444. package/dist/server/server/daemon-worker.d.ts +2 -0
  445. package/dist/server/server/daemon-worker.d.ts.map +1 -0
  446. package/dist/server/server/daemon-worker.js +155 -0
  447. package/dist/server/server/daemon-worker.js.map +1 -0
  448. package/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  449. package/dist/server/server/dictation/dictation-stream-manager.d.ts.map +1 -0
  450. package/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  451. package/dist/server/server/dictation/dictation-stream-manager.js.map +1 -0
  452. package/dist/server/server/editor-targets.d.ts +18 -0
  453. package/dist/server/server/editor-targets.d.ts.map +1 -0
  454. package/dist/server/server/editor-targets.js +109 -0
  455. package/dist/server/server/editor-targets.js.map +1 -0
  456. package/dist/server/server/exports.d.ts +26 -0
  457. package/dist/server/server/exports.d.ts.map +1 -0
  458. package/dist/server/server/exports.js +25 -0
  459. package/dist/server/server/exports.js.map +1 -0
  460. package/dist/server/server/file-download/token-store.d.ts +24 -0
  461. package/dist/server/server/file-download/token-store.d.ts.map +1 -0
  462. package/dist/server/server/file-download/token-store.js +40 -0
  463. package/dist/server/server/file-download/token-store.js.map +1 -0
  464. package/dist/server/server/file-explorer/service.d.ts +51 -0
  465. package/dist/server/server/file-explorer/service.d.ts.map +1 -0
  466. package/dist/server/server/file-explorer/service.js +246 -0
  467. package/dist/server/server/file-explorer/service.js.map +1 -0
  468. package/dist/server/server/hostnames.d.ts +13 -0
  469. package/dist/server/server/hostnames.d.ts.map +1 -0
  470. package/dist/server/server/hostnames.js +94 -0
  471. package/dist/server/server/hostnames.js.map +1 -0
  472. package/dist/server/server/json-utils.d.ts +11 -0
  473. package/dist/server/server/json-utils.d.ts.map +1 -0
  474. package/dist/server/server/json-utils.js +45 -0
  475. package/dist/server/server/json-utils.js.map +1 -0
  476. package/dist/server/server/logger.d.ts +29 -0
  477. package/dist/server/server/logger.d.ts.map +1 -0
  478. package/dist/server/server/logger.js +125 -0
  479. package/dist/server/server/logger.js.map +1 -0
  480. package/dist/server/server/loop/rpc-schemas.d.ts +3005 -0
  481. package/dist/server/server/loop/rpc-schemas.d.ts.map +1 -0
  482. package/dist/server/server/loop/rpc-schemas.js +163 -0
  483. package/dist/server/server/loop/rpc-schemas.js.map +1 -0
  484. package/dist/server/server/loop-service.d.ts +529 -0
  485. package/dist/server/server/loop-service.d.ts.map +1 -0
  486. package/dist/server/server/loop-service.js +751 -0
  487. package/dist/server/server/loop-service.js.map +1 -0
  488. package/dist/server/server/messages.d.ts +9 -0
  489. package/dist/server/server/messages.d.ts.map +1 -0
  490. package/dist/server/server/messages.js +29 -0
  491. package/dist/server/server/messages.js.map +1 -0
  492. package/dist/server/server/package-version.d.ts +25 -0
  493. package/dist/server/server/package-version.d.ts.map +1 -0
  494. package/dist/server/server/package-version.js +60 -0
  495. package/dist/server/server/package-version.js.map +1 -0
  496. package/dist/server/server/pagination/cursor.d.ts +16 -0
  497. package/dist/server/server/pagination/cursor.d.ts.map +1 -0
  498. package/dist/server/server/pagination/cursor.js +62 -0
  499. package/dist/server/server/pagination/cursor.js.map +1 -0
  500. package/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  501. package/dist/server/server/pagination/sortable-pager.d.ts.map +1 -0
  502. package/dist/server/server/pagination/sortable-pager.js +68 -0
  503. package/dist/server/server/pagination/sortable-pager.js.map +1 -0
  504. package/dist/server/server/pairing-offer.d.ts +18 -0
  505. package/dist/server/server/pairing-offer.d.ts.map +1 -0
  506. package/dist/server/server/pairing-offer.js +47 -0
  507. package/dist/server/server/pairing-offer.js.map +1 -0
  508. package/dist/server/server/pairing-qr.d.ts +7 -0
  509. package/dist/server/server/pairing-qr.d.ts.map +1 -0
  510. package/dist/server/server/pairing-qr.js +45 -0
  511. package/dist/server/server/pairing-qr.js.map +1 -0
  512. package/dist/server/server/paseo-env.d.ts +13 -0
  513. package/dist/server/server/paseo-env.d.ts.map +1 -0
  514. package/dist/server/server/paseo-env.js +53 -0
  515. package/dist/server/server/paseo-env.js.map +1 -0
  516. package/dist/server/server/paseo-home.d.ts +2 -0
  517. package/dist/server/server/paseo-home.d.ts.map +1 -0
  518. package/dist/server/server/paseo-home.js +19 -0
  519. package/dist/server/server/paseo-home.js.map +1 -0
  520. package/dist/server/server/paseo-worktree-archive-service.d.ts +43 -0
  521. package/dist/server/server/paseo-worktree-archive-service.d.ts.map +1 -0
  522. package/dist/server/server/paseo-worktree-archive-service.js +145 -0
  523. package/dist/server/server/paseo-worktree-archive-service.js.map +1 -0
  524. package/dist/server/server/paseo-worktree-service.d.ts +43 -0
  525. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -0
  526. package/dist/server/server/paseo-worktree-service.js +218 -0
  527. package/dist/server/server/paseo-worktree-service.js.map +1 -0
  528. package/dist/server/server/path-utils.d.ts +4 -0
  529. package/dist/server/server/path-utils.d.ts.map +1 -0
  530. package/dist/server/server/path-utils.js +29 -0
  531. package/dist/server/server/path-utils.js.map +1 -0
  532. package/dist/server/server/persisted-config.d.ts +1056 -0
  533. package/dist/server/server/persisted-config.d.ts.map +1 -0
  534. package/dist/server/server/persisted-config.js +398 -0
  535. package/dist/server/server/persisted-config.js.map +1 -0
  536. package/dist/server/server/persistence-hooks.d.ts +33 -0
  537. package/dist/server/server/persistence-hooks.d.ts.map +1 -0
  538. package/dist/server/server/persistence-hooks.js +99 -0
  539. package/dist/server/server/persistence-hooks.js.map +1 -0
  540. package/dist/server/server/pid-lock.d.ts +46 -0
  541. package/dist/server/server/pid-lock.d.ts.map +1 -0
  542. package/dist/server/server/pid-lock.js +170 -0
  543. package/dist/server/server/pid-lock.js.map +1 -0
  544. package/dist/server/server/private-files.d.ts +7 -0
  545. package/dist/server/server/private-files.d.ts.map +1 -0
  546. package/dist/server/server/private-files.js +42 -0
  547. package/dist/server/server/private-files.js.map +1 -0
  548. package/dist/server/server/push/notifications.d.ts +9 -0
  549. package/dist/server/server/push/notifications.d.ts.map +1 -0
  550. package/dist/server/server/push/notifications.js +15 -0
  551. package/dist/server/server/push/notifications.js.map +1 -0
  552. package/dist/server/server/push/push-service.d.ts +20 -0
  553. package/dist/server/server/push/push-service.d.ts.map +1 -0
  554. package/dist/server/server/push/push-service.js +66 -0
  555. package/dist/server/server/push/push-service.js.map +1 -0
  556. package/dist/server/server/push/token-store.d.ts +18 -0
  557. package/dist/server/server/push/token-store.d.ts.map +1 -0
  558. package/dist/server/server/push/token-store.js +68 -0
  559. package/dist/server/server/push/token-store.js.map +1 -0
  560. package/dist/server/server/relay-transport.d.ts +31 -0
  561. package/dist/server/server/relay-transport.d.ts.map +1 -0
  562. package/dist/server/server/relay-transport.js +514 -0
  563. package/dist/server/server/relay-transport.js.map +1 -0
  564. package/dist/server/server/resolve-worktree-creation-intent.d.ts +29 -0
  565. package/dist/server/server/resolve-worktree-creation-intent.d.ts.map +1 -0
  566. package/dist/server/server/resolve-worktree-creation-intent.js +119 -0
  567. package/dist/server/server/resolve-worktree-creation-intent.js.map +1 -0
  568. package/dist/server/server/schedule/cron.d.ts +4 -0
  569. package/dist/server/server/schedule/cron.d.ts.map +1 -0
  570. package/dist/server/server/schedule/cron.js +103 -0
  571. package/dist/server/server/schedule/cron.js.map +1 -0
  572. package/dist/server/server/schedule/rpc-schemas.d.ts +3909 -0
  573. package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -0
  574. package/dist/server/server/schedule/rpc-schemas.js +151 -0
  575. package/dist/server/server/schedule/rpc-schemas.js.map +1 -0
  576. package/dist/server/server/schedule/service.d.ts +40 -0
  577. package/dist/server/server/schedule/service.d.ts.map +1 -0
  578. package/dist/server/server/schedule/service.js +476 -0
  579. package/dist/server/server/schedule/service.js.map +1 -0
  580. package/dist/server/server/schedule/store.d.ts +13 -0
  581. package/dist/server/server/schedule/store.d.ts.map +1 -0
  582. package/dist/server/server/schedule/store.js +56 -0
  583. package/dist/server/server/schedule/store.js.map +1 -0
  584. package/dist/server/server/schedule/types.d.ts +726 -0
  585. package/dist/server/server/schedule/types.d.ts.map +1 -0
  586. package/dist/server/server/schedule/types.js +73 -0
  587. package/dist/server/server/schedule/types.js.map +1 -0
  588. package/dist/server/server/script-health-monitor.d.ts +39 -0
  589. package/dist/server/server/script-health-monitor.d.ts.map +1 -0
  590. package/dist/server/server/script-health-monitor.js +159 -0
  591. package/dist/server/server/script-health-monitor.js.map +1 -0
  592. package/dist/server/server/script-proxy.d.ts +40 -0
  593. package/dist/server/server/script-proxy.d.ts.map +1 -0
  594. package/dist/server/server/script-proxy.js +245 -0
  595. package/dist/server/server/script-proxy.js.map +1 -0
  596. package/dist/server/server/script-route-branch-handler.d.ts +10 -0
  597. package/dist/server/server/script-route-branch-handler.d.ts.map +1 -0
  598. package/dist/server/server/script-route-branch-handler.js +45 -0
  599. package/dist/server/server/script-route-branch-handler.js.map +1 -0
  600. package/dist/server/server/script-status-projection.d.ts +34 -0
  601. package/dist/server/server/script-status-projection.d.ts.map +1 -0
  602. package/dist/server/server/script-status-projection.js +152 -0
  603. package/dist/server/server/script-status-projection.js.map +1 -0
  604. package/dist/server/server/server-id.d.ts +17 -0
  605. package/dist/server/server/server-id.d.ts.map +1 -0
  606. package/dist/server/server/server-id.js +68 -0
  607. package/dist/server/server/server-id.js.map +1 -0
  608. package/dist/server/server/session.d.ts +586 -0
  609. package/dist/server/server/session.d.ts.map +1 -0
  610. package/dist/server/server/session.js +7072 -0
  611. package/dist/server/server/session.js.map +1 -0
  612. package/dist/server/server/speech/audio.d.ts +10 -0
  613. package/dist/server/server/speech/audio.d.ts.map +1 -0
  614. package/dist/server/server/speech/audio.js +101 -0
  615. package/dist/server/server/speech/audio.js.map +1 -0
  616. package/dist/server/server/speech/provider-resolver.d.ts +3 -0
  617. package/dist/server/server/speech/provider-resolver.d.ts.map +1 -0
  618. package/dist/server/server/speech/provider-resolver.js +7 -0
  619. package/dist/server/server/speech/provider-resolver.js.map +1 -0
  620. package/dist/server/server/speech/providers/local/config.d.ts +30 -0
  621. package/dist/server/server/speech/providers/local/config.d.ts.map +1 -0
  622. package/dist/server/server/speech/providers/local/config.js +134 -0
  623. package/dist/server/server/speech/providers/local/config.js.map +1 -0
  624. package/dist/server/server/speech/providers/local/models.d.ts +11 -0
  625. package/dist/server/server/speech/providers/local/models.d.ts.map +1 -0
  626. package/dist/server/server/speech/providers/local/models.js +17 -0
  627. package/dist/server/server/speech/providers/local/models.js.map +1 -0
  628. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts +24 -0
  629. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.d.ts.map +1 -0
  630. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js +459 -0
  631. package/dist/server/server/speech/providers/local/pocket/pocket-tts-onnx.js.map +1 -0
  632. package/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  633. package/dist/server/server/speech/providers/local/runtime.d.ts.map +1 -0
  634. package/dist/server/server/speech/providers/local/runtime.js +278 -0
  635. package/dist/server/server/speech/providers/local/runtime.js.map +1 -0
  636. package/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  637. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +117 -0
  638. package/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts.map +1 -0
  639. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js +169 -0
  640. package/dist/server/server/speech/providers/local/sherpa/model-catalog.js.map +1 -0
  641. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  642. package/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts.map +1 -0
  643. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js +167 -0
  644. package/dist/server/server/speech/providers/local/sherpa/model-downloader.js.map +1 -0
  645. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  646. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts.map +1 -0
  647. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  648. package/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js.map +1 -0
  649. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts +56 -0
  650. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.d.ts.map +1 -0
  651. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js +91 -0
  652. package/dist/server/server/speech/providers/local/sherpa/sherpa-online-recognizer.js.map +1 -0
  653. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts +7 -0
  654. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.d.ts.map +1 -0
  655. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js +11 -0
  656. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-loader.js.map +1 -0
  657. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  658. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts.map +1 -0
  659. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  660. package/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js.map +1 -0
  661. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  662. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts.map +1 -0
  663. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  664. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js.map +1 -0
  665. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  666. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts.map +1 -0
  667. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  668. package/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js.map +1 -0
  669. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts +23 -0
  670. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.d.ts.map +1 -0
  671. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js +116 -0
  672. package/dist/server/server/speech/providers/local/sherpa/sherpa-realtime-session.js.map +1 -0
  673. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  674. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts.map +1 -0
  675. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  676. package/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  677. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts +23 -0
  678. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.d.ts.map +1 -0
  679. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js +141 -0
  680. package/dist/server/server/speech/providers/local/sherpa/sherpa-stt.js.map +1 -0
  681. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  682. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts.map +1 -0
  683. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +115 -0
  684. package/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js.map +1 -0
  685. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  686. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts.map +1 -0
  687. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  688. package/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js.map +1 -0
  689. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  690. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts.map +1 -0
  691. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  692. package/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js.map +1 -0
  693. package/dist/server/server/speech/providers/openai/config.d.ts +22 -0
  694. package/dist/server/server/speech/providers/openai/config.d.ts.map +1 -0
  695. package/dist/server/server/speech/providers/openai/config.js +107 -0
  696. package/dist/server/server/speech/providers/openai/config.js.map +1 -0
  697. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts +42 -0
  698. package/dist/server/server/speech/providers/openai/realtime-transcription-session.d.ts.map +1 -0
  699. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js +168 -0
  700. package/dist/server/server/speech/providers/openai/realtime-transcription-session.js.map +1 -0
  701. package/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  702. package/dist/server/server/speech/providers/openai/runtime.d.ts.map +1 -0
  703. package/dist/server/server/speech/providers/openai/runtime.js +117 -0
  704. package/dist/server/server/speech/providers/openai/runtime.js.map +1 -0
  705. package/dist/server/server/speech/providers/openai/stt.d.ts +22 -0
  706. package/dist/server/server/speech/providers/openai/stt.d.ts.map +1 -0
  707. package/dist/server/server/speech/providers/openai/stt.js +207 -0
  708. package/dist/server/server/speech/providers/openai/stt.js.map +1 -0
  709. package/dist/server/server/speech/providers/openai/tts.d.ts +18 -0
  710. package/dist/server/server/speech/providers/openai/tts.d.ts.map +1 -0
  711. package/dist/server/server/speech/providers/openai/tts.js +47 -0
  712. package/dist/server/server/speech/providers/openai/tts.js.map +1 -0
  713. package/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  714. package/dist/server/server/speech/speech-config-resolver.d.ts.map +1 -0
  715. package/dist/server/server/speech/speech-config-resolver.js +132 -0
  716. package/dist/server/server/speech/speech-config-resolver.js.map +1 -0
  717. package/dist/server/server/speech/speech-provider.d.ts +59 -0
  718. package/dist/server/server/speech/speech-provider.d.ts.map +1 -0
  719. package/dist/server/server/speech/speech-provider.js +2 -0
  720. package/dist/server/server/speech/speech-provider.js.map +1 -0
  721. package/dist/server/server/speech/speech-runtime.d.ts +45 -0
  722. package/dist/server/server/speech/speech-runtime.d.ts.map +1 -0
  723. package/dist/server/server/speech/speech-runtime.js +562 -0
  724. package/dist/server/server/speech/speech-runtime.js.map +1 -0
  725. package/dist/server/server/speech/speech-types.d.ts +24 -0
  726. package/dist/server/server/speech/speech-types.d.ts.map +1 -0
  727. package/dist/server/server/speech/speech-types.js +8 -0
  728. package/dist/server/server/speech/speech-types.js.map +1 -0
  729. package/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  730. package/dist/server/server/speech/turn-detection-provider.d.ts.map +1 -0
  731. package/dist/server/server/speech/turn-detection-provider.js +2 -0
  732. package/dist/server/server/speech/turn-detection-provider.js.map +1 -0
  733. package/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  734. package/dist/server/server/utils/diff-highlighter.d.ts.map +1 -0
  735. package/dist/server/server/utils/diff-highlighter.js +279 -0
  736. package/dist/server/server/utils/diff-highlighter.js.map +1 -0
  737. package/dist/server/server/voice/voice-turn-controller.d.ts +38 -0
  738. package/dist/server/server/voice/voice-turn-controller.d.ts.map +1 -0
  739. package/dist/server/server/voice/voice-turn-controller.js +393 -0
  740. package/dist/server/server/voice/voice-turn-controller.js.map +1 -0
  741. package/dist/server/server/voice-config.d.ts +15 -0
  742. package/dist/server/server/voice-config.d.ts.map +1 -0
  743. package/dist/server/server/voice-config.js +54 -0
  744. package/dist/server/server/voice-config.js.map +1 -0
  745. package/dist/server/server/voice-permission-policy.d.ts +4 -0
  746. package/dist/server/server/voice-permission-policy.d.ts.map +1 -0
  747. package/dist/server/server/voice-permission-policy.js +13 -0
  748. package/dist/server/server/voice-permission-policy.js.map +1 -0
  749. package/dist/server/server/voice-types.d.ts +12 -0
  750. package/dist/server/server/voice-types.d.ts.map +1 -0
  751. package/dist/server/server/voice-types.js +2 -0
  752. package/dist/server/server/voice-types.js.map +1 -0
  753. package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
  754. package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
  755. package/dist/server/server/websocket/runtime-metrics.js +148 -0
  756. package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
  757. package/dist/server/server/websocket-server.d.ts +153 -0
  758. package/dist/server/server/websocket-server.d.ts.map +1 -0
  759. package/dist/server/server/websocket-server.js +1300 -0
  760. package/dist/server/server/websocket-server.js.map +1 -0
  761. package/dist/server/server/workspace-archive-service.d.ts +8 -0
  762. package/dist/server/server/workspace-archive-service.d.ts.map +1 -0
  763. package/dist/server/server/workspace-archive-service.js +17 -0
  764. package/dist/server/server/workspace-archive-service.js.map +1 -0
  765. package/dist/server/server/workspace-directory.d.ts +67 -0
  766. package/dist/server/server/workspace-directory.d.ts.map +1 -0
  767. package/dist/server/server/workspace-directory.js +214 -0
  768. package/dist/server/server/workspace-directory.js.map +1 -0
  769. package/dist/server/server/workspace-git-metadata.d.ts +24 -0
  770. package/dist/server/server/workspace-git-metadata.d.ts.map +1 -0
  771. package/dist/server/server/workspace-git-metadata.js +55 -0
  772. package/dist/server/server/workspace-git-metadata.js.map +1 -0
  773. package/dist/server/server/workspace-git-service.d.ts +257 -0
  774. package/dist/server/server/workspace-git-service.d.ts.map +1 -0
  775. package/dist/server/server/workspace-git-service.js +1277 -0
  776. package/dist/server/server/workspace-git-service.js.map +1 -0
  777. package/dist/server/server/workspace-reconciliation-service.d.ts +58 -0
  778. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -0
  779. package/dist/server/server/workspace-reconciliation-service.js +274 -0
  780. package/dist/server/server/workspace-reconciliation-service.js.map +1 -0
  781. package/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  782. package/dist/server/server/workspace-registry-bootstrap.d.ts.map +1 -0
  783. package/dist/server/server/workspace-registry-bootstrap.js +108 -0
  784. package/dist/server/server/workspace-registry-bootstrap.js.map +1 -0
  785. package/dist/server/server/workspace-registry-model.d.ts +55 -0
  786. package/dist/server/server/workspace-registry-model.d.ts.map +1 -0
  787. package/dist/server/server/workspace-registry-model.js +191 -0
  788. package/dist/server/server/workspace-registry-model.js.map +1 -0
  789. package/dist/server/server/workspace-registry.d.ts +135 -0
  790. package/dist/server/server/workspace-registry.d.ts.map +1 -0
  791. package/dist/server/server/workspace-registry.js +162 -0
  792. package/dist/server/server/workspace-registry.js.map +1 -0
  793. package/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  794. package/dist/server/server/workspace-script-runtime-store.d.ts.map +1 -0
  795. package/dist/server/server/workspace-script-runtime-store.js +78 -0
  796. package/dist/server/server/workspace-script-runtime-store.js.map +1 -0
  797. package/dist/server/server/workspace-service-env.d.ts +17 -0
  798. package/dist/server/server/workspace-service-env.d.ts.map +1 -0
  799. package/dist/server/server/workspace-service-env.js +80 -0
  800. package/dist/server/server/workspace-service-env.js.map +1 -0
  801. package/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  802. package/dist/server/server/workspace-service-port-registry.d.ts.map +1 -0
  803. package/dist/server/server/workspace-service-port-registry.js +59 -0
  804. package/dist/server/server/workspace-service-port-registry.js.map +1 -0
  805. package/dist/server/server/worktree-bootstrap.d.ts +74 -0
  806. package/dist/server/server/worktree-bootstrap.d.ts.map +1 -0
  807. package/dist/server/server/worktree-bootstrap.js +716 -0
  808. package/dist/server/server/worktree-bootstrap.js.map +1 -0
  809. package/dist/server/server/worktree-branch-name-generator.d.ts +21 -0
  810. package/dist/server/server/worktree-branch-name-generator.d.ts.map +1 -0
  811. package/dist/server/server/worktree-branch-name-generator.js +59 -0
  812. package/dist/server/server/worktree-branch-name-generator.js.map +1 -0
  813. package/dist/server/server/worktree-core.d.ts +29 -0
  814. package/dist/server/server/worktree-core.d.ts.map +1 -0
  815. package/dist/server/server/worktree-core.js +99 -0
  816. package/dist/server/server/worktree-core.js.map +1 -0
  817. package/dist/server/server/worktree-errors.d.ts +12 -0
  818. package/dist/server/server/worktree-errors.d.ts.map +1 -0
  819. package/dist/server/server/worktree-errors.js +28 -0
  820. package/dist/server/server/worktree-errors.js.map +1 -0
  821. package/dist/server/server/worktree-session.d.ts +149 -0
  822. package/dist/server/server/worktree-session.d.ts.map +1 -0
  823. package/dist/server/server/worktree-session.js +464 -0
  824. package/dist/server/server/worktree-session.js.map +1 -0
  825. package/dist/server/services/github-service.d.ts +279 -0
  826. package/dist/server/services/github-service.d.ts.map +1 -0
  827. package/dist/server/services/github-service.js +1666 -0
  828. package/dist/server/services/github-service.js.map +1 -0
  829. package/dist/server/shared/agent-attention-notification.d.ts +41 -0
  830. package/dist/server/shared/agent-attention-notification.d.ts.map +1 -0
  831. package/dist/server/shared/agent-attention-notification.js +140 -0
  832. package/dist/server/shared/agent-attention-notification.js.map +1 -0
  833. package/dist/server/shared/agent-labels.d.ts +2 -0
  834. package/dist/server/shared/agent-labels.d.ts.map +1 -0
  835. package/dist/server/shared/agent-labels.js +2 -0
  836. package/dist/server/shared/agent-labels.js.map +1 -0
  837. package/dist/server/shared/agent-lifecycle.d.ts +3 -0
  838. package/dist/server/shared/agent-lifecycle.d.ts.map +1 -0
  839. package/dist/server/shared/agent-lifecycle.js +8 -0
  840. package/dist/server/shared/agent-lifecycle.js.map +1 -0
  841. package/dist/server/shared/agent-state-bucket.d.ts +13 -0
  842. package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
  843. package/dist/server/shared/agent-state-bucket.js +41 -0
  844. package/dist/server/shared/agent-state-bucket.js.map +1 -0
  845. package/dist/server/shared/binary-frames/file-transfer.d.ts +56 -0
  846. package/dist/server/shared/binary-frames/file-transfer.d.ts.map +1 -0
  847. package/dist/server/shared/binary-frames/file-transfer.js +108 -0
  848. package/dist/server/shared/binary-frames/file-transfer.js.map +1 -0
  849. package/dist/server/shared/binary-frames/index.d.ts +3 -0
  850. package/dist/server/shared/binary-frames/index.d.ts.map +1 -0
  851. package/dist/server/shared/binary-frames/index.js +3 -0
  852. package/dist/server/shared/binary-frames/index.js.map +1 -0
  853. package/dist/server/shared/binary-frames/terminal.d.ts +36 -0
  854. package/dist/server/shared/binary-frames/terminal.d.ts.map +1 -0
  855. package/dist/server/shared/binary-frames/terminal.js +99 -0
  856. package/dist/server/shared/binary-frames/terminal.js.map +1 -0
  857. package/dist/server/shared/client-capabilities.d.ts +5 -0
  858. package/dist/server/shared/client-capabilities.d.ts.map +1 -0
  859. package/dist/server/shared/client-capabilities.js +4 -0
  860. package/dist/server/shared/client-capabilities.js.map +1 -0
  861. package/dist/server/shared/connection-offer.d.ts +80 -0
  862. package/dist/server/shared/connection-offer.d.ts.map +1 -0
  863. package/dist/server/shared/connection-offer.js +53 -0
  864. package/dist/server/shared/connection-offer.js.map +1 -0
  865. package/dist/server/shared/daemon-endpoints.d.ts +47 -0
  866. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -0
  867. package/dist/server/shared/daemon-endpoints.js +201 -0
  868. package/dist/server/shared/daemon-endpoints.js.map +1 -0
  869. package/dist/server/shared/error-utils.d.ts +11 -0
  870. package/dist/server/shared/error-utils.d.ts.map +1 -0
  871. package/dist/server/shared/error-utils.js +27 -0
  872. package/dist/server/shared/error-utils.js.map +1 -0
  873. package/dist/server/shared/git-remote.d.ts +16 -0
  874. package/dist/server/shared/git-remote.d.ts.map +1 -0
  875. package/dist/server/shared/git-remote.js +72 -0
  876. package/dist/server/shared/git-remote.js.map +1 -0
  877. package/dist/server/shared/host-connection-schema.d.ts +23 -0
  878. package/dist/server/shared/host-connection-schema.d.ts.map +1 -0
  879. package/dist/server/shared/host-connection-schema.js +9 -0
  880. package/dist/server/shared/host-connection-schema.js.map +1 -0
  881. package/dist/server/shared/importable-providers.d.ts +7 -0
  882. package/dist/server/shared/importable-providers.d.ts.map +1 -0
  883. package/dist/server/shared/importable-providers.js +7 -0
  884. package/dist/server/shared/importable-providers.js.map +1 -0
  885. package/dist/server/shared/literal-union.d.ts +2 -0
  886. package/dist/server/shared/literal-union.d.ts.map +1 -0
  887. package/dist/server/shared/literal-union.js +2 -0
  888. package/dist/server/shared/literal-union.js.map +1 -0
  889. package/dist/server/shared/messages.d.ts +140180 -0
  890. package/dist/server/shared/messages.d.ts.map +1 -0
  891. package/dist/server/shared/messages.js +3259 -0
  892. package/dist/server/shared/messages.js.map +1 -0
  893. package/dist/server/shared/path-utils.d.ts +2 -0
  894. package/dist/server/shared/path-utils.d.ts.map +1 -0
  895. package/dist/server/shared/path-utils.js +16 -0
  896. package/dist/server/shared/path-utils.js.map +1 -0
  897. package/dist/server/shared/terminal-input-mode.d.ts +26 -0
  898. package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
  899. package/dist/server/shared/terminal-input-mode.js +151 -0
  900. package/dist/server/shared/terminal-input-mode.js.map +1 -0
  901. package/dist/server/shared/tool-call-display.d.ts +11 -0
  902. package/dist/server/shared/tool-call-display.d.ts.map +1 -0
  903. package/dist/server/shared/tool-call-display.js +135 -0
  904. package/dist/server/shared/tool-call-display.js.map +1 -0
  905. package/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  906. package/dist/server/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  907. package/dist/server/terminal/terminal-capture.d.ts +12 -0
  908. package/dist/server/terminal/terminal-capture.d.ts.map +1 -0
  909. package/dist/server/terminal/terminal-capture.js +43 -0
  910. package/dist/server/terminal/terminal-capture.js.map +1 -0
  911. package/dist/server/terminal/terminal-manager-factory.d.ts +3 -0
  912. package/dist/server/terminal/terminal-manager-factory.d.ts.map +1 -0
  913. package/dist/server/terminal/terminal-manager-factory.js +5 -0
  914. package/dist/server/terminal/terminal-manager-factory.js.map +1 -0
  915. package/dist/server/terminal/terminal-manager.d.ts +47 -0
  916. package/dist/server/terminal/terminal-manager.d.ts.map +1 -0
  917. package/dist/server/terminal/terminal-manager.js +183 -0
  918. package/dist/server/terminal/terminal-manager.js.map +1 -0
  919. package/dist/server/terminal/terminal-output-coalescer.d.ts +30 -0
  920. package/dist/server/terminal/terminal-output-coalescer.d.ts.map +1 -0
  921. package/dist/server/terminal/terminal-output-coalescer.js +55 -0
  922. package/dist/server/terminal/terminal-output-coalescer.js.map +1 -0
  923. package/dist/server/terminal/terminal-session-controller.d.ts +64 -0
  924. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -0
  925. package/dist/server/terminal/terminal-session-controller.js +653 -0
  926. package/dist/server/terminal/terminal-session-controller.js.map +1 -0
  927. package/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  928. package/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  929. package/dist/server/terminal/terminal-worker-process.d.ts.map +1 -0
  930. package/dist/server/terminal/terminal-worker-process.js +221 -0
  931. package/dist/server/terminal/terminal-worker-process.js.map +1 -0
  932. package/dist/server/terminal/terminal-worker-protocol.d.ts +113 -0
  933. package/dist/server/terminal/terminal-worker-protocol.d.ts.map +1 -0
  934. package/dist/server/terminal/terminal-worker-protocol.js +2 -0
  935. package/dist/server/terminal/terminal-worker-protocol.js.map +1 -0
  936. package/dist/server/terminal/terminal.d.ts +99 -0
  937. package/dist/server/terminal/terminal.d.ts.map +1 -0
  938. package/dist/server/terminal/terminal.js +877 -0
  939. package/dist/server/terminal/terminal.js.map +1 -0
  940. package/dist/server/terminal/worker-terminal-manager.d.ts +19 -0
  941. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -0
  942. package/dist/server/terminal/worker-terminal-manager.js +492 -0
  943. package/dist/server/terminal/worker-terminal-manager.js.map +1 -0
  944. package/dist/server/utils/branch-slug.d.ts +14 -0
  945. package/dist/server/utils/branch-slug.d.ts.map +1 -0
  946. package/dist/server/utils/branch-slug.js +49 -0
  947. package/dist/server/utils/branch-slug.js.map +1 -0
  948. package/dist/server/utils/build-metadata-prompt.d.ts +14 -0
  949. package/dist/server/utils/build-metadata-prompt.d.ts.map +1 -0
  950. package/dist/server/utils/build-metadata-prompt.js +28 -0
  951. package/dist/server/utils/build-metadata-prompt.js.map +1 -0
  952. package/dist/server/utils/checkout-git.d.ts +213 -0
  953. package/dist/server/utils/checkout-git.d.ts.map +1 -0
  954. package/dist/server/utils/checkout-git.js +1885 -0
  955. package/dist/server/utils/checkout-git.js.map +1 -0
  956. package/dist/server/utils/directory-suggestions.d.ts +26 -0
  957. package/dist/server/utils/directory-suggestions.d.ts.map +1 -0
  958. package/dist/server/utils/directory-suggestions.js +732 -0
  959. package/dist/server/utils/directory-suggestions.js.map +1 -0
  960. package/dist/server/utils/executable.d.ts +10 -0
  961. package/dist/server/utils/executable.d.ts.map +1 -0
  962. package/dist/server/utils/executable.js +116 -0
  963. package/dist/server/utils/executable.js.map +1 -0
  964. package/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  965. package/dist/server/utils/git-rev-parse-path.d.ts.map +1 -0
  966. package/dist/server/utils/git-rev-parse-path.js +21 -0
  967. package/dist/server/utils/git-rev-parse-path.js.map +1 -0
  968. package/dist/server/utils/github-remote.d.ts +9 -0
  969. package/dist/server/utils/github-remote.d.ts.map +1 -0
  970. package/dist/server/utils/github-remote.js +62 -0
  971. package/dist/server/utils/github-remote.js.map +1 -0
  972. package/dist/server/utils/paseo-config-file.d.ts +30 -0
  973. package/dist/server/utils/paseo-config-file.d.ts.map +1 -0
  974. package/dist/server/utils/paseo-config-file.js +90 -0
  975. package/dist/server/utils/paseo-config-file.js.map +1 -0
  976. package/dist/server/utils/paseo-config-schema.d.ts +915 -0
  977. package/dist/server/utils/paseo-config-schema.d.ts.map +1 -0
  978. package/dist/server/utils/paseo-config-schema.js +77 -0
  979. package/dist/server/utils/paseo-config-schema.js.map +1 -0
  980. package/dist/server/utils/path.d.ts +16 -0
  981. package/dist/server/utils/path.d.ts.map +1 -0
  982. package/dist/server/utils/path.js +110 -0
  983. package/dist/server/utils/path.js.map +1 -0
  984. package/dist/server/utils/project-icon.d.ts +39 -0
  985. package/dist/server/utils/project-icon.d.ts.map +1 -0
  986. package/dist/server/utils/project-icon.js +364 -0
  987. package/dist/server/utils/project-icon.js.map +1 -0
  988. package/dist/server/utils/promise-timeout.d.ts +9 -0
  989. package/dist/server/utils/promise-timeout.d.ts.map +1 -0
  990. package/dist/server/utils/promise-timeout.js +25 -0
  991. package/dist/server/utils/promise-timeout.js.map +1 -0
  992. package/dist/server/utils/run-git-command.d.ts +20 -0
  993. package/dist/server/utils/run-git-command.d.ts.map +1 -0
  994. package/dist/server/utils/run-git-command.js +146 -0
  995. package/dist/server/utils/run-git-command.js.map +1 -0
  996. package/dist/server/utils/script-hostname.d.ts +8 -0
  997. package/dist/server/utils/script-hostname.d.ts.map +1 -0
  998. package/dist/server/utils/script-hostname.js +14 -0
  999. package/dist/server/utils/script-hostname.js.map +1 -0
  1000. package/dist/server/utils/spawn.d.ts +33 -0
  1001. package/dist/server/utils/spawn.d.ts.map +1 -0
  1002. package/dist/server/utils/spawn.js +71 -0
  1003. package/dist/server/utils/spawn.js.map +1 -0
  1004. package/dist/server/utils/string-command-shell.d.ts +10 -0
  1005. package/dist/server/utils/string-command-shell.d.ts.map +1 -0
  1006. package/dist/server/utils/string-command-shell.js +21 -0
  1007. package/dist/server/utils/string-command-shell.js.map +1 -0
  1008. package/dist/server/utils/tree-kill.d.ts +18 -0
  1009. package/dist/server/utils/tree-kill.d.ts.map +1 -0
  1010. package/dist/server/utils/tree-kill.js +77 -0
  1011. package/dist/server/utils/tree-kill.js.map +1 -0
  1012. package/dist/server/utils/windows-command.d.ts +15 -0
  1013. package/dist/server/utils/windows-command.d.ts.map +1 -0
  1014. package/dist/server/utils/windows-command.js +41 -0
  1015. package/dist/server/utils/windows-command.js.map +1 -0
  1016. package/dist/server/utils/worktree-metadata.d.ts +91 -0
  1017. package/dist/server/utils/worktree-metadata.d.ts.map +1 -0
  1018. package/dist/server/utils/worktree-metadata.js +174 -0
  1019. package/dist/server/utils/worktree-metadata.js.map +1 -0
  1020. package/dist/server/utils/worktree.d.ts +195 -0
  1021. package/dist/server/utils/worktree.d.ts.map +1 -0
  1022. package/dist/server/utils/worktree.js +1004 -0
  1023. package/dist/server/utils/worktree.js.map +1 -0
  1024. package/dist/server/utils/wrap-user-instructions.d.ts +2 -0
  1025. package/dist/server/utils/wrap-user-instructions.d.ts.map +1 -0
  1026. package/dist/server/utils/wrap-user-instructions.js +13 -0
  1027. package/dist/server/utils/wrap-user-instructions.js.map +1 -0
  1028. package/dist/src/server/agent/agent-sdk-types.js +22 -0
  1029. package/dist/src/server/agent/agent-sdk-types.js.map +1 -0
  1030. package/dist/src/server/agent/agent-title-limits.js +3 -0
  1031. package/dist/src/server/agent/agent-title-limits.js.map +1 -0
  1032. package/dist/src/server/agent/provider-launch-config.js +190 -0
  1033. package/dist/src/server/agent/provider-launch-config.js.map +1 -0
  1034. package/dist/src/server/agent/provider-manifest.js +211 -0
  1035. package/dist/src/server/agent/provider-manifest.js.map +1 -0
  1036. package/dist/src/server/chat/chat-rpc-schemas.js +103 -0
  1037. package/dist/src/server/chat/chat-rpc-schemas.js.map +1 -0
  1038. package/dist/src/server/chat/chat-types.js +22 -0
  1039. package/dist/src/server/chat/chat-types.js.map +1 -0
  1040. package/dist/src/server/loop/rpc-schemas.js +163 -0
  1041. package/dist/src/server/loop/rpc-schemas.js.map +1 -0
  1042. package/dist/src/server/paseo-env.js +53 -0
  1043. package/dist/src/server/paseo-env.js.map +1 -0
  1044. package/dist/src/server/paseo-home.js +19 -0
  1045. package/dist/src/server/paseo-home.js.map +1 -0
  1046. package/dist/src/server/persisted-config.js +398 -0
  1047. package/dist/src/server/persisted-config.js.map +1 -0
  1048. package/dist/src/server/pid-lock.js +170 -0
  1049. package/dist/src/server/pid-lock.js.map +1 -0
  1050. package/dist/src/server/private-files.js +42 -0
  1051. package/dist/src/server/private-files.js.map +1 -0
  1052. package/dist/src/server/schedule/rpc-schemas.js +151 -0
  1053. package/dist/src/server/schedule/rpc-schemas.js.map +1 -0
  1054. package/dist/src/server/schedule/types.js +73 -0
  1055. package/dist/src/server/schedule/types.js.map +1 -0
  1056. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  1057. package/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js.map +1 -0
  1058. package/dist/src/shared/agent-lifecycle.js +8 -0
  1059. package/dist/src/shared/agent-lifecycle.js.map +1 -0
  1060. package/dist/src/shared/client-capabilities.js +4 -0
  1061. package/dist/src/shared/client-capabilities.js.map +1 -0
  1062. package/dist/src/shared/literal-union.js +2 -0
  1063. package/dist/src/shared/literal-union.js.map +1 -0
  1064. package/dist/src/shared/messages.js +3259 -0
  1065. package/dist/src/shared/messages.js.map +1 -0
  1066. package/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  1067. package/dist/src/terminal/shell-integration/zsh/paseo-integration.zsh +32 -0
  1068. package/dist/src/utils/executable.js +116 -0
  1069. package/dist/src/utils/executable.js.map +1 -0
  1070. package/dist/src/utils/paseo-config-schema.js +77 -0
  1071. package/dist/src/utils/paseo-config-schema.js.map +1 -0
  1072. package/dist/src/utils/spawn.js +71 -0
  1073. package/dist/src/utils/spawn.js.map +1 -0
  1074. package/dist/src/utils/windows-command.js +41 -0
  1075. package/dist/src/utils/windows-command.js.map +1 -0
  1076. package/package.json +115 -0
  1077. package/src/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
@@ -0,0 +1,4364 @@
1
+ import { getAgentStreamEventTurnId, } from "../agent-sdk-types.js";
2
+ import { homedir } from "node:os";
3
+ import { randomUUID } from "node:crypto";
4
+ import * as fsSync from "node:fs";
5
+ import fs from "node:fs/promises";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { z } from "zod";
9
+ import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
10
+ import { composeSystemPromptParts } from "../system-prompt.js";
11
+ import { curateAgentActivity } from "../activity-curator.js";
12
+ import { mapCodexRolloutToolCall, mapCodexToolCallFromThreadItem, } from "./codex/tool-call-mapper.js";
13
+ import { createProviderEnv, createProviderEnvSpec, resolveProviderCommandPrefix, } from "../provider-launch-config.js";
14
+ import { findExecutable, isCommandAvailable, probeExecutable } from "../../../utils/executable.js";
15
+ import { createPathEquivalenceMatcher } from "../../../utils/path.js";
16
+ import { spawnProcess } from "../../../utils/spawn.js";
17
+ import { extractCodexTerminalSessionId, nonEmptyString } from "./tool-call-mapper-utils.js";
18
+ import { buildCodexFeatures, codexModelSupportsFastMode } from "./codex-feature-definitions.js";
19
+ import { CodexAppServerClient, } from "./codex/app-server-transport.js";
20
+ import { renderProviderImageOutputAsAssistantMarkdown, } from "./provider-image-output.js";
21
+ import { normalizeProviderReplayTimestamp } from "../provider-history-timestamps.js";
22
+ import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnosticError, resolveBinaryVersion, toDiagnosticErrorMessage, } from "./diagnostic-utils.js";
23
+ import { runProviderTurn } from "./provider-runner.js";
24
+ function assertChildWithPipes(child) {
25
+ if (!child.stdin || !child.stdout || !child.stderr) {
26
+ throw new Error("Child process did not expose stdio pipes");
27
+ }
28
+ }
29
+ function isRecord(value) {
30
+ return value != null && typeof value === "object" && !Array.isArray(value);
31
+ }
32
+ const TURN_START_TIMEOUT_MS = 90 * 1000;
33
+ const INTERRUPT_TIMEOUT_MS = 2000;
34
+ const CODEX_PROVIDER = "codex";
35
+ const CODEX_IMAGE_ATTACHMENT_DIR = "paseo-attachments";
36
+ const ASSISTANT_MESSAGE_BOUNDARY_MARKDOWN = "\n\n---\n\n";
37
+ const CODEX_TOOL_THREAD_ITEM_TYPES = new Set([
38
+ "commandExecution",
39
+ "fileChange",
40
+ "mcpToolCall",
41
+ "webSearch",
42
+ "collabAgentToolCall",
43
+ ]);
44
+ const CODEX_CONTEXT_COMPACTION_TYPE = "contextCompaction";
45
+ const CODEX_PLAN_IMPLEMENTATION_PROMPT_PREFIX = "The user approved the plan. Implement it now. Do not restate or revise the plan unless blocked.";
46
+ // Codex's experimental `goals` feature ships in 0.128.0+. Older binaries reject
47
+ // `--enable goals` at launch, so we gate by version and silently skip the flag
48
+ // (and the /goal slash command) when the binary is too old.
49
+ const CODEX_GOALS_MIN_VERSION = [0, 128, 0];
50
+ const CODEX_AUTO_REVIEW_MIN_VERSION = [0, 115, 0];
51
+ function parseCodexVersion(versionOutput) {
52
+ const match = versionOutput.match(/(\d+)\.(\d+)\.(\d+)/);
53
+ if (!match)
54
+ return null;
55
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
56
+ }
57
+ function codexVersionAtLeast(versionOutput, min) {
58
+ const parsed = parseCodexVersion(versionOutput);
59
+ if (!parsed)
60
+ return false;
61
+ for (let i = 0; i < 3; i += 1) {
62
+ if (parsed[i] > min[i])
63
+ return true;
64
+ if (parsed[i] < min[i])
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ function parseGoalSubcommand(args) {
70
+ const trimmed = (args ?? "").trim();
71
+ if (!trimmed)
72
+ return { kind: "usage" };
73
+ const lower = trimmed.toLowerCase();
74
+ if (lower === "pause")
75
+ return { kind: "pause" };
76
+ if (lower === "resume")
77
+ return { kind: "resume" };
78
+ if (lower === "clear")
79
+ return { kind: "clear" };
80
+ return { kind: "set", objective: trimmed };
81
+ }
82
+ function formatOutOfBandStatusMessage(text) {
83
+ return `${text.replace(/\n+$/u, "")}\n\n`;
84
+ }
85
+ const CODEX_APP_SERVER_CAPABILITIES = {
86
+ supportsStreaming: true,
87
+ supportsSessionPersistence: true,
88
+ supportsDynamicModes: false,
89
+ supportsMcpServers: true,
90
+ supportsReasoningStream: true,
91
+ supportsToolInvocations: true,
92
+ };
93
+ const CODEX_MODES = [
94
+ {
95
+ id: "auto",
96
+ label: "Default Permissions",
97
+ description: "Edit files and run commands with Codex's default approval flow.",
98
+ },
99
+ {
100
+ id: "auto-review",
101
+ label: "Auto-review",
102
+ description: "Same workspace-write permissions as Default, but eligible `on-request` approvals are routed through the auto-reviewer subagent.",
103
+ },
104
+ {
105
+ id: "full-access",
106
+ label: "Full Access",
107
+ description: "Edit files, run commands, and access the network without additional prompts.",
108
+ },
109
+ ];
110
+ const DEFAULT_CODEX_MODE_ID = "auto";
111
+ const MODE_PRESETS = {
112
+ "read-only": {
113
+ approvalPolicy: "on-request",
114
+ sandbox: "read-only",
115
+ },
116
+ auto: {
117
+ approvalPolicy: "on-request",
118
+ sandbox: "workspace-write",
119
+ },
120
+ "auto-review": {
121
+ approvalPolicy: "on-request",
122
+ sandbox: "workspace-write",
123
+ approvalsReviewer: "auto_review",
124
+ },
125
+ "full-access": {
126
+ approvalPolicy: "never",
127
+ sandbox: "danger-full-access",
128
+ networkAccess: true,
129
+ },
130
+ };
131
+ function isAutoReviewReviewer(value) {
132
+ return value === "auto_review" || value === "guardian_subagent";
133
+ }
134
+ function applyApprovalsReviewerParam(params, preset) {
135
+ if (preset.approvalsReviewer) {
136
+ params.approvalsReviewer = preset.approvalsReviewer;
137
+ }
138
+ }
139
+ function shouldPromoteThreadResponseToAutoReview(params) {
140
+ return (isAutoReviewReviewer(params.approvalsReviewer) &&
141
+ params.approvalPolicy === "on-request" &&
142
+ params.sandbox === "workspace-write");
143
+ }
144
+ function validateCodexMode(modeId) {
145
+ if (!(modeId in MODE_PRESETS)) {
146
+ const validModes = Object.keys(MODE_PRESETS).join(", ");
147
+ throw new Error(`Invalid Codex mode "${modeId}". Valid modes are: ${validModes}`);
148
+ }
149
+ }
150
+ function normalizeCodexThinkingOptionId(thinkingOptionId) {
151
+ if (typeof thinkingOptionId !== "string") {
152
+ return undefined;
153
+ }
154
+ const normalized = thinkingOptionId.trim();
155
+ if (!normalized || normalized === "default") {
156
+ return undefined;
157
+ }
158
+ return normalized;
159
+ }
160
+ function normalizeCodexModelId(modelId) {
161
+ if (typeof modelId !== "string") {
162
+ return undefined;
163
+ }
164
+ const normalized = modelId.trim();
165
+ if (!normalized) {
166
+ return undefined;
167
+ }
168
+ return normalized;
169
+ }
170
+ function normalizeCodexModelLabel(displayName) {
171
+ return displayName.replace(/\bgpt\b/gi, "GPT");
172
+ }
173
+ function isSchemaRecord(value) {
174
+ return typeof value === "object" && value !== null && !Array.isArray(value);
175
+ }
176
+ function isObjectSchemaNode(schema) {
177
+ const type = schema.type;
178
+ return (isSchemaRecord(schema.properties) ||
179
+ type === "object" ||
180
+ (Array.isArray(type) && type.includes("object")));
181
+ }
182
+ function normalizeCodexOutputSchemaNode(schema, schemaPath) {
183
+ if (Array.isArray(schema)) {
184
+ return schema.map((entry, index) => normalizeCodexOutputSchemaNode(entry, `${schemaPath}[${index}]`));
185
+ }
186
+ if (!isSchemaRecord(schema)) {
187
+ return schema;
188
+ }
189
+ const normalized = {};
190
+ for (const [key, value] of Object.entries(schema)) {
191
+ normalized[key] = normalizeCodexOutputSchemaNode(value, `${schemaPath}.${key}`);
192
+ }
193
+ if (!isObjectSchemaNode(normalized)) {
194
+ return normalized;
195
+ }
196
+ if (normalized.additionalProperties === undefined) {
197
+ normalized.additionalProperties = false;
198
+ }
199
+ else if (normalized.additionalProperties !== false) {
200
+ throw new Error(`Codex structured outputs require ${schemaPath} to set additionalProperties to false for object schemas.`);
201
+ }
202
+ const properties = isSchemaRecord(normalized.properties) ? normalized.properties : null;
203
+ if (!properties) {
204
+ return normalized;
205
+ }
206
+ const propertyKeys = Object.keys(properties);
207
+ const existingRequired = Array.isArray(normalized.required)
208
+ ? normalized.required.filter((entry) => typeof entry === "string")
209
+ : [];
210
+ normalized.required = Array.from(new Set([...existingRequired, ...propertyKeys]));
211
+ return normalized;
212
+ }
213
+ function normalizeCodexOutputSchema(schema) {
214
+ if (!isSchemaRecord(schema)) {
215
+ throw new Error("Codex structured outputs require a JSON object schema.");
216
+ }
217
+ const normalized = normalizeCodexOutputSchemaNode(schema, "$");
218
+ if (!isSchemaRecord(normalized) || !isObjectSchemaNode(normalized)) {
219
+ throw new Error("Codex structured outputs require a root object schema.");
220
+ }
221
+ return normalized;
222
+ }
223
+ function mergeCodexConfiguredDefaults(primary, fallback) {
224
+ return {
225
+ model: primary.model ?? fallback.model,
226
+ thinkingOptionId: primary.thinkingOptionId ?? fallback.thinkingOptionId,
227
+ };
228
+ }
229
+ function codexMicrosoftStorePackageRoot() {
230
+ const localAppData = process.env.LOCALAPPDATA;
231
+ if (!localAppData) {
232
+ return null;
233
+ }
234
+ return path.join(localAppData, "Packages");
235
+ }
236
+ async function findCodexMicrosoftStoreBinary() {
237
+ if (process.platform !== "win32") {
238
+ return null;
239
+ }
240
+ const packageRoot = codexMicrosoftStorePackageRoot();
241
+ if (!packageRoot) {
242
+ return null;
243
+ }
244
+ let entries;
245
+ try {
246
+ entries = await fs.readdir(packageRoot, { withFileTypes: true });
247
+ }
248
+ catch {
249
+ return null;
250
+ }
251
+ const codexPackages = entries
252
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith("OpenAI.Codex_"))
253
+ .map((entry) => entry.name)
254
+ .sort();
255
+ for (const packageName of codexPackages) {
256
+ const candidate = path.join(packageRoot, packageName, "LocalCache", "Local", "OpenAI", "Codex", "bin", "codex.exe");
257
+ if (await probeExecutable(candidate)) {
258
+ return candidate;
259
+ }
260
+ }
261
+ return null;
262
+ }
263
+ async function findDefaultCodexBinary() {
264
+ return (await findExecutable("codex")) ?? (await findCodexMicrosoftStoreBinary());
265
+ }
266
+ async function resolveCodexBinary() {
267
+ const found = await findDefaultCodexBinary();
268
+ if (found) {
269
+ return found;
270
+ }
271
+ throw new Error("Codex binary not found. Install the Codex CLI (https://github.com/openai/codex) and ensure it is available in your shell PATH.");
272
+ }
273
+ async function resolveCodexLaunchPrefix(runtimeSettings) {
274
+ return resolveProviderCommandPrefix(runtimeSettings?.command, resolveCodexBinary);
275
+ }
276
+ function resolveCodexHomeDir() {
277
+ return process.env.CODEX_HOME ?? path.join(os.homedir(), ".codex");
278
+ }
279
+ function decodeEscapedChar(next) {
280
+ if (next === "n")
281
+ return "\n";
282
+ if (next === "t")
283
+ return "\t";
284
+ return next;
285
+ }
286
+ function resolvePermissionDecision(response) {
287
+ if (response.behavior === "allow")
288
+ return "accept";
289
+ if (response.interrupt)
290
+ return "cancel";
291
+ return "decline";
292
+ }
293
+ function firstPositiveFiniteNumber(primary, secondary) {
294
+ if (typeof primary === "number" && Number.isFinite(primary) && primary > 0) {
295
+ return primary;
296
+ }
297
+ if (typeof secondary === "number" && Number.isFinite(secondary) && secondary > 0) {
298
+ return secondary;
299
+ }
300
+ return undefined;
301
+ }
302
+ function tokenizeCommandArgs(args) {
303
+ const tokens = [];
304
+ let current = "";
305
+ let quote = null;
306
+ for (let i = 0; i < args.length; i += 1) {
307
+ const ch = args[i];
308
+ if (quote) {
309
+ if (ch === quote) {
310
+ quote = null;
311
+ continue;
312
+ }
313
+ if (ch === "\\" && i + 1 < args.length) {
314
+ const next = args[i + 1];
315
+ if (next === quote || next === "\\" || next === "n" || next === "t") {
316
+ i += 1;
317
+ current += decodeEscapedChar(next);
318
+ continue;
319
+ }
320
+ }
321
+ current += ch;
322
+ continue;
323
+ }
324
+ if (ch === "'" || ch === '"') {
325
+ quote = ch;
326
+ continue;
327
+ }
328
+ if (/\s/.test(ch)) {
329
+ if (current) {
330
+ tokens.push(current);
331
+ current = "";
332
+ }
333
+ continue;
334
+ }
335
+ current += ch;
336
+ }
337
+ if (current) {
338
+ tokens.push(current);
339
+ }
340
+ return tokens;
341
+ }
342
+ function parseFrontMatter(markdown) {
343
+ const lines = markdown.split("\n");
344
+ if (lines[0]?.trim() !== "---") {
345
+ return { frontMatter: {}, body: markdown };
346
+ }
347
+ let end = -1;
348
+ for (let i = 1; i < lines.length; i += 1) {
349
+ if (lines[i]?.trim() === "---") {
350
+ end = i;
351
+ break;
352
+ }
353
+ }
354
+ if (end === -1) {
355
+ return { frontMatter: {}, body: markdown };
356
+ }
357
+ const metaLines = lines.slice(1, end);
358
+ const body = lines.slice(end + 1).join("\n");
359
+ const frontMatter = {};
360
+ for (const line of metaLines) {
361
+ const trimmed = line.trim();
362
+ if (!trimmed || trimmed.startsWith("#")) {
363
+ continue;
364
+ }
365
+ const idx = trimmed.indexOf(":");
366
+ if (idx <= 0) {
367
+ continue;
368
+ }
369
+ const key = trimmed.slice(0, idx).trim();
370
+ let value = trimmed.slice(idx + 1).trim();
371
+ value = value.replace(/^['"]/, "").replace(/['"]$/, "");
372
+ if (key && value) {
373
+ frontMatter[key] = value;
374
+ }
375
+ }
376
+ return { frontMatter, body };
377
+ }
378
+ async function listCodexCustomPrompts() {
379
+ const codexHome = resolveCodexHomeDir();
380
+ const promptsDir = path.join(codexHome, "prompts");
381
+ let entries;
382
+ try {
383
+ entries = await fs.readdir(promptsDir, { withFileTypes: true });
384
+ }
385
+ catch {
386
+ return [];
387
+ }
388
+ const mdEntries = entries.filter((entry) => entry.isFile() && entry.name.endsWith(".md") && entry.name.slice(0, -".md".length));
389
+ const parsedCommands = await Promise.all(mdEntries.map(async (entry) => {
390
+ const name = entry.name.slice(0, -".md".length);
391
+ const fullPath = path.join(promptsDir, entry.name);
392
+ let content;
393
+ try {
394
+ content = await fs.readFile(fullPath, "utf8");
395
+ }
396
+ catch {
397
+ return null;
398
+ }
399
+ const parsed = parseFrontMatter(content);
400
+ const description = parsed.frontMatter["description"] ?? "Custom prompt";
401
+ const argumentHint = parsed.frontMatter["argument-hint"] ?? parsed.frontMatter["argument_hint"] ?? "";
402
+ return {
403
+ name: `prompts:${name}`,
404
+ description,
405
+ argumentHint,
406
+ };
407
+ }));
408
+ const commands = parsedCommands.filter((cmd) => cmd !== null);
409
+ return commands.sort((a, b) => a.name.localeCompare(b.name));
410
+ }
411
+ async function listCodexSkills(cwd, workspaceGitService) {
412
+ const candidates = [];
413
+ candidates.push(path.join(cwd, ".codex", "skills"));
414
+ const repoRoot = workspaceGitService
415
+ ? await workspaceGitService.resolveRepoRoot(cwd).catch(() => null)
416
+ : null;
417
+ if (repoRoot) {
418
+ candidates.push(path.join(path.dirname(cwd), ".codex", "skills"));
419
+ candidates.push(path.join(repoRoot, ".codex", "skills"));
420
+ }
421
+ candidates.push(path.join(resolveCodexHomeDir(), "skills"));
422
+ const candidateReads = await Promise.all(candidates.map(async (dir) => {
423
+ let entries;
424
+ try {
425
+ entries = await fs.readdir(dir, { withFileTypes: true });
426
+ }
427
+ catch {
428
+ return [];
429
+ }
430
+ const dirEntries = entries.filter((entry) => entry.isDirectory() || entry.isSymbolicLink());
431
+ const skillContents = await Promise.all(dirEntries.map(async (entry) => {
432
+ const skillDir = path.join(dir, entry.name);
433
+ const skillPath = path.join(skillDir, "SKILL.md");
434
+ try {
435
+ return await fs.readFile(skillPath, "utf8");
436
+ }
437
+ catch {
438
+ return null;
439
+ }
440
+ }));
441
+ return skillContents.filter((content) => content !== null);
442
+ }));
443
+ const commandsByName = new Map();
444
+ for (const skillContents of candidateReads) {
445
+ for (const content of skillContents) {
446
+ const { frontMatter } = parseFrontMatter(content);
447
+ const name = frontMatter["name"];
448
+ const description = frontMatter["description"];
449
+ if (!name || !description) {
450
+ continue;
451
+ }
452
+ if (!commandsByName.has(name)) {
453
+ commandsByName.set(name, {
454
+ name,
455
+ description,
456
+ argumentHint: "",
457
+ });
458
+ }
459
+ }
460
+ }
461
+ return Array.from(commandsByName.values()).sort((a, b) => a.name.localeCompare(b.name));
462
+ }
463
+ function escapeRegExp(value) {
464
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
465
+ }
466
+ function expandCodexCustomPrompt(template, args) {
467
+ const trimmedArgs = args ? args.trim() : "";
468
+ const tokens = trimmedArgs ? tokenizeCommandArgs(trimmedArgs) : [];
469
+ const named = {};
470
+ const positional = [];
471
+ for (const token of tokens) {
472
+ const idx = token.indexOf("=");
473
+ if (idx > 0) {
474
+ const key = token.slice(0, idx);
475
+ const value = token.slice(idx + 1);
476
+ if (key) {
477
+ named[key] = value;
478
+ continue;
479
+ }
480
+ }
481
+ positional.push(token);
482
+ }
483
+ const dollarPlaceholder = "__CODEX_DOLLAR_PLACEHOLDER__";
484
+ let out = template.split("$$").join(dollarPlaceholder);
485
+ out = out.split("$ARGUMENTS").join(trimmedArgs);
486
+ for (let i = 1; i <= 9; i += 1) {
487
+ const value = positional[i - 1] ?? "";
488
+ out = out.split(`$${i}`).join(value);
489
+ }
490
+ const namedKeys = Object.keys(named).sort((a, b) => b.length - a.length);
491
+ for (const key of namedKeys) {
492
+ const value = named[key] ?? "";
493
+ const re = new RegExp(`\\$${escapeRegExp(key)}\\b`, "g");
494
+ out = out.replace(re, value);
495
+ }
496
+ out = out.split(dollarPlaceholder).join("$");
497
+ return out;
498
+ }
499
+ function toCodexMcpConfig(config) {
500
+ switch (config.type) {
501
+ case "stdio":
502
+ return {
503
+ command: config.command,
504
+ args: config.args,
505
+ env: config.env,
506
+ };
507
+ case "http":
508
+ return {
509
+ url: config.url,
510
+ http_headers: config.headers,
511
+ };
512
+ case "sse":
513
+ return {
514
+ url: config.url,
515
+ http_headers: config.headers,
516
+ };
517
+ default: {
518
+ const _exhaustive = config;
519
+ throw new Error(`Unsupported MCP config type: ${String(_exhaustive.type)}`);
520
+ }
521
+ }
522
+ }
523
+ function toObjectRecord(value) {
524
+ return isRecord(value) ? value : undefined;
525
+ }
526
+ const CodexModelListResponseSchema = z.object({
527
+ data: z
528
+ .array(z.object({
529
+ id: z.string(),
530
+ displayName: z.string().optional(),
531
+ description: z.string().optional(),
532
+ isDefault: z.boolean().optional(),
533
+ model: z.string().optional(),
534
+ defaultReasoningEffort: z.string().optional(),
535
+ supportedReasoningEfforts: z
536
+ .array(z.object({
537
+ reasoningEffort: z.string().optional(),
538
+ description: z.string().optional(),
539
+ }))
540
+ .optional(),
541
+ }))
542
+ .optional(),
543
+ });
544
+ function filterCodexThreadsByCwd(threads, cwd) {
545
+ if (!cwd) {
546
+ return threads;
547
+ }
548
+ // thread/list rows carry an optional cwd. The descriptor builder later
549
+ // falls back to process.cwd() if the field is missing, so we only match
550
+ // here when the row genuinely carries a cwd string — otherwise threads
551
+ // with no cwd would falsely match the daemon's own cwd.
552
+ const matchesCwd = createPathEquivalenceMatcher(cwd);
553
+ return threads.filter((thread) => typeof thread.cwd === "string" && matchesCwd(thread.cwd));
554
+ }
555
+ function toAgentUsage(tokenUsage) {
556
+ const usage = toObjectRecord(tokenUsage);
557
+ if (!usage)
558
+ return undefined;
559
+ const last = toObjectRecord(usage.last);
560
+ const contextWindowMaxTokens = firstPositiveFiniteNumber(usage.model_context_window, usage.modelContextWindow);
561
+ const contextWindowUsedTokens = firstPositiveFiniteNumber(last?.total_tokens, last?.totalTokens);
562
+ return {
563
+ inputTokens: typeof last?.inputTokens === "number" ? last.inputTokens : undefined,
564
+ cachedInputTokens: typeof last?.cachedInputTokens === "number" ? last.cachedInputTokens : undefined,
565
+ outputTokens: typeof last?.outputTokens === "number" ? last.outputTokens : undefined,
566
+ ...(contextWindowMaxTokens !== undefined ? { contextWindowMaxTokens } : {}),
567
+ ...(contextWindowUsedTokens !== undefined ? { contextWindowUsedTokens } : {}),
568
+ };
569
+ }
570
+ function extractUserText(content) {
571
+ if (!Array.isArray(content))
572
+ return null;
573
+ const parts = [];
574
+ for (const item of content) {
575
+ const record = toObjectRecord(item);
576
+ if (!record) {
577
+ continue;
578
+ }
579
+ if (record.type === "text" && typeof record.text === "string") {
580
+ parts.push(record.text);
581
+ }
582
+ }
583
+ return parts.length > 0 ? parts.join("\n") : null;
584
+ }
585
+ function normalizePlanMarkdown(text) {
586
+ return text
587
+ .split("\n")
588
+ .map((line) => line.replace(/\s+$/, ""))
589
+ .join("\n")
590
+ .trim();
591
+ }
592
+ function planStepsToMarkdown(steps) {
593
+ const lines = steps
594
+ .map((entry) => entry.step.trim())
595
+ .filter((step) => step.length > 0)
596
+ .map((step) => {
597
+ if (/^(#{1,6}\s|[-*+]\s|\d+\.\s)/.test(step)) {
598
+ return step;
599
+ }
600
+ return `- ${step}`;
601
+ });
602
+ return normalizePlanMarkdown(lines.join("\n"));
603
+ }
604
+ function mapCodexPlanToToolCall(params) {
605
+ const text = normalizePlanMarkdown(params.text);
606
+ if (!text) {
607
+ return null;
608
+ }
609
+ return {
610
+ type: "tool_call",
611
+ callId: params.callId,
612
+ name: "plan",
613
+ status: "completed",
614
+ error: null,
615
+ detail: {
616
+ type: "plan",
617
+ text,
618
+ },
619
+ };
620
+ }
621
+ function buildPlanPermissionActions(options) {
622
+ const actions = [
623
+ {
624
+ id: "reject",
625
+ label: "Reject",
626
+ behavior: "deny",
627
+ variant: "danger",
628
+ intent: "dismiss",
629
+ },
630
+ {
631
+ id: "implement",
632
+ label: "Implement",
633
+ behavior: "allow",
634
+ variant: "primary",
635
+ intent: "implement",
636
+ },
637
+ ];
638
+ if (options?.includeResumeAction && options.resumeLabel) {
639
+ actions.push({
640
+ id: "implement_resume",
641
+ label: options.resumeLabel,
642
+ behavior: "allow",
643
+ variant: "secondary",
644
+ intent: "implement_resume",
645
+ });
646
+ }
647
+ return actions;
648
+ }
649
+ function buildCodexPlanImplementationPrompt(planText) {
650
+ const normalizedPlan = normalizePlanMarkdown(planText);
651
+ if (!normalizedPlan) {
652
+ return `${CODEX_PLAN_IMPLEMENTATION_PROMPT_PREFIX} Make the required code changes and verify them.`;
653
+ }
654
+ return [
655
+ CODEX_PLAN_IMPLEMENTATION_PROMPT_PREFIX,
656
+ "Approved plan:",
657
+ normalizedPlan,
658
+ "Carry out the work, make the necessary code changes, and verify the result.",
659
+ ].join("\n\n");
660
+ }
661
+ function normalizeCodexQuestionPrompts(raw) {
662
+ if (!Array.isArray(raw)) {
663
+ return [];
664
+ }
665
+ const questions = [];
666
+ for (const item of raw) {
667
+ const record = toObjectRecord(item);
668
+ if (!record) {
669
+ continue;
670
+ }
671
+ const id = nonEmptyString(record.id);
672
+ const header = nonEmptyString(record.header);
673
+ const question = nonEmptyString(record.question);
674
+ if (!id || !header || !question) {
675
+ continue;
676
+ }
677
+ const options = Array.isArray(record.options)
678
+ ? record.options.flatMap((option) => {
679
+ const optionRecord = toObjectRecord(option);
680
+ if (!optionRecord) {
681
+ return [];
682
+ }
683
+ const label = nonEmptyString(optionRecord.label);
684
+ if (!label) {
685
+ return [];
686
+ }
687
+ return [
688
+ {
689
+ label,
690
+ ...(typeof optionRecord.description === "string" &&
691
+ optionRecord.description.trim().length > 0
692
+ ? { description: optionRecord.description }
693
+ : {}),
694
+ },
695
+ ];
696
+ })
697
+ : [];
698
+ questions.push({
699
+ id,
700
+ header,
701
+ question,
702
+ options,
703
+ ...(record.multiSelect === true ? { multiSelect: true } : {}),
704
+ ...(record.isOther === true ? { isOther: true } : {}),
705
+ ...(record.isSecret === true ? { isSecret: true } : {}),
706
+ });
707
+ }
708
+ return questions;
709
+ }
710
+ function formatCodexQuestionPrompts(questions) {
711
+ return questions
712
+ .map((question) => {
713
+ const lines = [`${question.header}: ${question.question}`];
714
+ if (question.options.length > 0) {
715
+ lines.push(`Options: ${question.options.map((option) => option.label).join(", ")}`);
716
+ }
717
+ return lines.join("\n");
718
+ })
719
+ .join("\n\n")
720
+ .trim();
721
+ }
722
+ function mapCodexQuestionRequestToToolCall(params) {
723
+ const formattedQuestions = formatCodexQuestionPrompts(params.questions);
724
+ const formattedAnswers = params.answers && Object.keys(params.answers).length > 0
725
+ ? Object.entries(params.answers)
726
+ .map(([id, values]) => `${id}: ${values.join(", ")}`)
727
+ .join("\n")
728
+ : null;
729
+ const detailText = params.status === "completed" && formattedAnswers
730
+ ? [formattedQuestions, "Answers:", formattedAnswers].filter(Boolean).join("\n\n")
731
+ : formattedQuestions;
732
+ const base = {
733
+ type: "tool_call",
734
+ callId: params.callId,
735
+ name: "request_user_input",
736
+ detail: {
737
+ type: "plain_text",
738
+ text: detailText,
739
+ icon: "brain",
740
+ },
741
+ metadata: {
742
+ questions: params.questions,
743
+ ...(params.answers ? { answers: params.answers } : {}),
744
+ },
745
+ };
746
+ if (params.status === "failed") {
747
+ return {
748
+ ...base,
749
+ status: "failed",
750
+ error: params.error ?? { message: "Question dismissed" },
751
+ };
752
+ }
753
+ if (params.status === "canceled") {
754
+ return {
755
+ ...base,
756
+ status: "canceled",
757
+ error: null,
758
+ };
759
+ }
760
+ if (params.status === "running") {
761
+ return {
762
+ ...base,
763
+ status: "running",
764
+ error: null,
765
+ };
766
+ }
767
+ return {
768
+ ...base,
769
+ status: "completed",
770
+ error: null,
771
+ };
772
+ }
773
+ function mapCodexQuestionResponseByHeader(params) {
774
+ if (params.response.behavior !== "allow") {
775
+ return null;
776
+ }
777
+ const updatedInputRecord = toObjectRecord(params.response.updatedInput);
778
+ const answersRecord = toObjectRecord(updatedInputRecord?.answers);
779
+ if (!answersRecord) {
780
+ return null;
781
+ }
782
+ const answers = {};
783
+ for (const question of params.questions) {
784
+ const rawAnswer = answersRecord[question.header];
785
+ if (typeof rawAnswer !== "string") {
786
+ continue;
787
+ }
788
+ const normalizedAnswer = rawAnswer.trim();
789
+ if (!normalizedAnswer) {
790
+ continue;
791
+ }
792
+ const values = question.multiSelect
793
+ ? normalizedAnswer
794
+ .split(",")
795
+ .map((entry) => entry.trim())
796
+ .filter((entry) => entry.length > 0)
797
+ : [normalizedAnswer];
798
+ if (values.length > 0) {
799
+ answers[question.id] = { answers: values };
800
+ }
801
+ }
802
+ return Object.keys(answers).length > 0 ? answers : null;
803
+ }
804
+ function extractPatchLikeText(value) {
805
+ const record = toObjectRecord(value);
806
+ if (!record) {
807
+ return undefined;
808
+ }
809
+ const candidates = [
810
+ record.diff,
811
+ record.patch,
812
+ record.unified_diff,
813
+ record.unifiedDiff,
814
+ record.content,
815
+ record.newString,
816
+ ];
817
+ for (const candidate of candidates) {
818
+ if (typeof candidate === "string" && candidate.length > 0) {
819
+ return candidate;
820
+ }
821
+ }
822
+ return undefined;
823
+ }
824
+ function normalizeCodexThreadItemType(rawType) {
825
+ if (!rawType) {
826
+ return rawType;
827
+ }
828
+ switch (rawType) {
829
+ case "UserMessage":
830
+ return "userMessage";
831
+ case "AgentMessage":
832
+ return "agentMessage";
833
+ case "Reasoning":
834
+ return "reasoning";
835
+ case "Plan":
836
+ return "plan";
837
+ case "CommandExecution":
838
+ return "commandExecution";
839
+ case "FileChange":
840
+ return "fileChange";
841
+ case "McpToolCall":
842
+ return "mcpToolCall";
843
+ case "WebSearch":
844
+ return "webSearch";
845
+ case "CollabAgentToolCall":
846
+ return "collabAgentToolCall";
847
+ case "ImageView":
848
+ return "imageView";
849
+ case "ImageGeneration":
850
+ return "imageGeneration";
851
+ default:
852
+ return rawType;
853
+ }
854
+ }
855
+ function normalizeCodexCommandValue(value) {
856
+ if (typeof value === "string") {
857
+ const trimmed = value.trim();
858
+ if (!trimmed.length) {
859
+ return null;
860
+ }
861
+ const wrapperMatch = trimmed.match(/^(?:\/bin\/)?(?:zsh|bash|sh)\s+-(?:lc|c)\s+([\s\S]+)$/);
862
+ if (!wrapperMatch) {
863
+ return trimmed;
864
+ }
865
+ const candidate = wrapperMatch[1]?.trim() ?? "";
866
+ if (!candidate.length) {
867
+ return trimmed;
868
+ }
869
+ if ((candidate.startsWith('"') && candidate.endsWith('"')) ||
870
+ (candidate.startsWith("'") && candidate.endsWith("'"))) {
871
+ return candidate.slice(1, -1);
872
+ }
873
+ return candidate;
874
+ }
875
+ if (!Array.isArray(value)) {
876
+ return null;
877
+ }
878
+ const parts = value
879
+ .filter((entry) => typeof entry === "string")
880
+ .map((entry) => entry.trim())
881
+ .filter((entry) => entry.length > 0);
882
+ if (parts.length === 0) {
883
+ return null;
884
+ }
885
+ if (parts.length >= 3 && (parts[1] === "-lc" || parts[1] === "-c")) {
886
+ return parts[2] ?? parts;
887
+ }
888
+ return parts;
889
+ }
890
+ function parseCodexPatchChanges(changes) {
891
+ const resolvePathFromRecord = (record) => {
892
+ const directPath = (typeof record.path === "string" && record.path.trim().length > 0
893
+ ? record.path.trim()
894
+ : "") ||
895
+ (typeof record.file_path === "string" && record.file_path.trim().length > 0
896
+ ? record.file_path.trim()
897
+ : "") ||
898
+ (typeof record.filePath === "string" && record.filePath.trim().length > 0
899
+ ? record.filePath.trim()
900
+ : "");
901
+ return directPath;
902
+ };
903
+ if (!changes || typeof changes !== "object") {
904
+ return [];
905
+ }
906
+ if (Array.isArray(changes)) {
907
+ return changes
908
+ .map((entry) => {
909
+ const record = toObjectRecord(entry);
910
+ if (!record) {
911
+ return null;
912
+ }
913
+ const pathValue = resolvePathFromRecord(record);
914
+ if (!pathValue) {
915
+ return null;
916
+ }
917
+ return {
918
+ path: pathValue,
919
+ kind: (typeof record.kind === "string" && record.kind) ||
920
+ (typeof record.type === "string" && record.type) ||
921
+ undefined,
922
+ content: extractPatchLikeText(record),
923
+ };
924
+ })
925
+ .filter((entry) => entry !== null);
926
+ }
927
+ const recordChanges = toObjectRecord(changes);
928
+ if (!recordChanges) {
929
+ return [];
930
+ }
931
+ const directPathValue = resolvePathFromRecord(recordChanges);
932
+ if (directPathValue) {
933
+ return [
934
+ {
935
+ path: directPathValue,
936
+ kind: (typeof recordChanges.kind === "string" && recordChanges.kind) ||
937
+ (typeof recordChanges.type === "string" && recordChanges.type) ||
938
+ undefined,
939
+ content: extractPatchLikeText(recordChanges),
940
+ },
941
+ ];
942
+ }
943
+ return Object.entries(recordChanges)
944
+ .map(([entryPath, value]) => {
945
+ const normalizedPath = entryPath.trim();
946
+ if (!normalizedPath) {
947
+ return null;
948
+ }
949
+ return {
950
+ path: normalizedPath,
951
+ kind: value &&
952
+ typeof value === "object" &&
953
+ typeof value.type === "string"
954
+ ? (value.type ?? undefined)
955
+ : undefined,
956
+ content: extractPatchLikeText(value),
957
+ };
958
+ })
959
+ .filter((entry) => entry !== null);
960
+ }
961
+ function codexPatchTextFields(text) {
962
+ if (typeof text !== "string") {
963
+ return {};
964
+ }
965
+ const normalized = text.trimStart();
966
+ const looksLikeUnifiedDiff = normalized.startsWith("diff --git") ||
967
+ normalized.startsWith("@@") ||
968
+ normalized.startsWith("--- ") ||
969
+ normalized.startsWith("+++ ");
970
+ return looksLikeUnifiedDiff ? { patch: text } : { content: text };
971
+ }
972
+ function toRunningToolCall(item) {
973
+ return {
974
+ ...item,
975
+ status: "running",
976
+ error: null,
977
+ };
978
+ }
979
+ function isEditToolCallWithoutContent(item) {
980
+ if (item.type !== "tool_call") {
981
+ return false;
982
+ }
983
+ if (item.detail.type !== "edit") {
984
+ return false;
985
+ }
986
+ const hasDiff = typeof item.detail.unifiedDiff === "string" && item.detail.unifiedDiff.trim().length > 0;
987
+ const hasNewString = typeof item.detail.newString === "string" && item.detail.newString.trim().length > 0;
988
+ return !hasDiff && !hasNewString;
989
+ }
990
+ function decodeCodexOutputDeltaChunk(chunk) {
991
+ const trimmed = chunk.trim();
992
+ if (trimmed.length === 0) {
993
+ return chunk;
994
+ }
995
+ if (!/^[A-Za-z0-9+/=]+$/.test(trimmed) || trimmed.length % 4 !== 0) {
996
+ return chunk;
997
+ }
998
+ try {
999
+ const decoded = Buffer.from(trimmed, "base64").toString("utf8");
1000
+ if (decoded.length === 0) {
1001
+ return chunk;
1002
+ }
1003
+ const normalizedInput = trimmed.replace(/=+$/, "");
1004
+ const normalizedRoundTrip = Buffer.from(decoded, "utf8").toString("base64").replace(/=+$/, "");
1005
+ return normalizedRoundTrip === normalizedInput ? decoded : chunk;
1006
+ }
1007
+ catch {
1008
+ return chunk;
1009
+ }
1010
+ }
1011
+ function mapCodexExecNotificationToToolCall(params) {
1012
+ const command = normalizeCodexCommandValue(params.command);
1013
+ if (!command) {
1014
+ return null;
1015
+ }
1016
+ const isFailure = params.running
1017
+ ? false
1018
+ : params.success === false || (typeof params.exitCode === "number" && params.exitCode !== 0);
1019
+ const output = params.running
1020
+ ? null
1021
+ : {
1022
+ command,
1023
+ ...(params.output !== null && params.output !== undefined ? { output: params.output } : {}),
1024
+ ...(params.exitCode !== null && params.exitCode !== undefined
1025
+ ? { exitCode: params.exitCode }
1026
+ : {}),
1027
+ };
1028
+ const mapped = mapCodexRolloutToolCall({
1029
+ callId: params.callId ?? null,
1030
+ name: "shell",
1031
+ input: {
1032
+ command,
1033
+ ...(params.cwd ? { cwd: params.cwd } : {}),
1034
+ },
1035
+ output,
1036
+ error: isFailure ? { message: params.stderr?.trim() || "Command failed" } : null,
1037
+ cwd: params.cwd ?? null,
1038
+ });
1039
+ if (!mapped) {
1040
+ return null;
1041
+ }
1042
+ return params.running ? toRunningToolCall(mapped) : mapped;
1043
+ }
1044
+ function mapCodexPatchNotificationToToolCall(params) {
1045
+ const files = parseCodexPatchChanges(params.changes);
1046
+ const firstPath = files[0]?.path;
1047
+ const firstPatchText = files
1048
+ .map((file) => file.content?.trim())
1049
+ .find((value) => typeof value === "string" && value.length > 0);
1050
+ const patchText = firstPatchText;
1051
+ const patchFields = codexPatchTextFields(patchText);
1052
+ const mapped = mapCodexRolloutToolCall({
1053
+ callId: params.callId ?? null,
1054
+ name: "apply_patch",
1055
+ input: firstPath
1056
+ ? {
1057
+ path: firstPath,
1058
+ ...patchFields,
1059
+ files: files.map((file) => ({ path: file.path, kind: file.kind })),
1060
+ }
1061
+ : {
1062
+ changes: params.changes ?? null,
1063
+ ...patchFields,
1064
+ },
1065
+ output: params.running
1066
+ ? null
1067
+ : {
1068
+ ...(files.length > 0
1069
+ ? {
1070
+ files: files.map((file) => Object.assign({ path: file.path }, file.kind ? { kind: file.kind } : {}, codexPatchTextFields(file.content ?? patchText))),
1071
+ }
1072
+ : {}),
1073
+ ...(params.stdout ? { stdout: params.stdout } : {}),
1074
+ ...(params.stderr ? { stderr: params.stderr } : {}),
1075
+ ...(params.success !== null && params.success !== undefined
1076
+ ? { success: params.success }
1077
+ : {}),
1078
+ },
1079
+ error: params.running || params.success !== false
1080
+ ? null
1081
+ : { message: params.stderr?.trim() || "Patch apply failed" },
1082
+ cwd: params.cwd ?? null,
1083
+ });
1084
+ if (!mapped) {
1085
+ return null;
1086
+ }
1087
+ return params.running ? toRunningToolCall(mapped) : mapped;
1088
+ }
1089
+ function mapCodexTerminalInteractionToToolCall(params) {
1090
+ const processId = nonEmptyString(params.processId ?? undefined);
1091
+ const callId = processId
1092
+ ? `terminal-session-${processId}`
1093
+ : (nonEmptyString(params.fallbackCallId ?? undefined) ?? "terminal-interaction");
1094
+ const label = nonEmptyString(params.command ?? undefined);
1095
+ return {
1096
+ type: "tool_call",
1097
+ callId,
1098
+ name: "terminal",
1099
+ status: "completed",
1100
+ error: null,
1101
+ detail: {
1102
+ type: "plain_text",
1103
+ ...(label ? { label } : {}),
1104
+ icon: "square_terminal",
1105
+ },
1106
+ ...(processId ? { metadata: { processId } } : {}),
1107
+ };
1108
+ }
1109
+ function mapCodexThreadPlanItem(normalizedItem) {
1110
+ const callId = nonEmptyString(normalizedItem.id ?? normalizedItem.itemId ?? undefined) ??
1111
+ `plan:${normalizePlanMarkdown(typeof normalizedItem.text === "string" ? normalizedItem.text : "")}`;
1112
+ return mapCodexPlanToToolCall({
1113
+ callId,
1114
+ text: typeof normalizedItem.text === "string" ? normalizedItem.text : "",
1115
+ });
1116
+ }
1117
+ function mapCodexThreadReasoningItem(normalizedItem) {
1118
+ const summary = Array.isArray(normalizedItem.summary) ? normalizedItem.summary.join("\n") : "";
1119
+ const content = Array.isArray(normalizedItem.content) ? normalizedItem.content.join("\n") : "";
1120
+ const text = summary || content;
1121
+ return text ? { type: "reasoning", text } : null;
1122
+ }
1123
+ function mapCodexThreadUserMessageItem(normalizedItem, includeUserMessage) {
1124
+ if (!includeUserMessage) {
1125
+ return null;
1126
+ }
1127
+ const text = extractUserText(normalizedItem.content) ?? "";
1128
+ return { type: "user_message", text };
1129
+ }
1130
+ function firstStringField(record, fields) {
1131
+ for (const field of fields) {
1132
+ const value = record[field];
1133
+ if (typeof value === "string") {
1134
+ return value;
1135
+ }
1136
+ }
1137
+ return null;
1138
+ }
1139
+ function readCodexHistoryTimestamp(item) {
1140
+ const record = toObjectRecord(item);
1141
+ if (!record) {
1142
+ return null;
1143
+ }
1144
+ return (normalizeProviderReplayTimestamp(record.timestamp) ??
1145
+ normalizeProviderReplayTimestamp(record.createdAt) ??
1146
+ normalizeProviderReplayTimestamp(record.created_at));
1147
+ }
1148
+ function readCodexTurnHistoryTimestamp(turn, timelineItem) {
1149
+ const record = toObjectRecord(turn);
1150
+ if (!record) {
1151
+ return null;
1152
+ }
1153
+ const startedAt = normalizeProviderReplayTimestamp(record.startedAt) ??
1154
+ normalizeProviderReplayTimestamp(record.started_at);
1155
+ const completedAt = normalizeProviderReplayTimestamp(record.completedAt) ??
1156
+ normalizeProviderReplayTimestamp(record.completed_at);
1157
+ if (timelineItem.type === "user_message") {
1158
+ return startedAt ?? completedAt;
1159
+ }
1160
+ return completedAt ?? startedAt;
1161
+ }
1162
+ function codexImageOutputFromResult(result) {
1163
+ if (typeof result === "string") {
1164
+ const trimmed = result.trim();
1165
+ if (trimmed.toLowerCase().startsWith("data:image/") ||
1166
+ (/^[A-Za-z0-9+/]+={0,2}$/.test(trimmed) && trimmed.length > 64)) {
1167
+ return { data: trimmed };
1168
+ }
1169
+ return { url: trimmed };
1170
+ }
1171
+ const resultRecord = toObjectRecord(result);
1172
+ if (!resultRecord) {
1173
+ return null;
1174
+ }
1175
+ return {
1176
+ path: firstStringField(resultRecord, ["path", "savedPath", "saved_path"]),
1177
+ url: firstStringField(resultRecord, ["url"]),
1178
+ data: firstStringField(resultRecord, ["data"]),
1179
+ mimeType: firstStringField(resultRecord, ["mimeType", "mime_type"]),
1180
+ };
1181
+ }
1182
+ function writeImageAttachmentSync(mimeType, data) {
1183
+ const attachmentsDir = path.join(os.tmpdir(), CODEX_IMAGE_ATTACHMENT_DIR);
1184
+ fsSync.mkdirSync(attachmentsDir, { recursive: true });
1185
+ const normalized = normalizeImageData(mimeType, data);
1186
+ const extension = getImageExtension(normalized.mimeType);
1187
+ const filename = `${randomUUID()}.${extension}`;
1188
+ const filePath = path.join(attachmentsDir, filename);
1189
+ fsSync.writeFileSync(filePath, Buffer.from(normalized.data, "base64"));
1190
+ return filePath;
1191
+ }
1192
+ function materializeCodexImageOutput(image) {
1193
+ return {
1194
+ path: writeImageAttachmentSync(image.mimeType ?? "image/png", image.data),
1195
+ };
1196
+ }
1197
+ function mapCodexThreadImageItem(normalizedType, normalizedItem) {
1198
+ if (normalizedType === "imageView") {
1199
+ return renderProviderImageOutputAsAssistantMarkdown({
1200
+ path: firstStringField(normalizedItem, ["path"]),
1201
+ });
1202
+ }
1203
+ const savedPath = firstStringField(normalizedItem, ["savedPath", "saved_path"]);
1204
+ const result = codexImageOutputFromResult(normalizedItem.result);
1205
+ return renderProviderImageOutputAsAssistantMarkdown({
1206
+ path: savedPath ?? result?.path ?? null,
1207
+ url: result?.url ?? null,
1208
+ data: result?.data ?? null,
1209
+ mimeType: result?.mimeType ?? null,
1210
+ }, { materialize: materializeCodexImageOutput });
1211
+ }
1212
+ function threadItemToTimeline(item, options) {
1213
+ const itemRecord = toObjectRecord(item);
1214
+ if (!itemRecord)
1215
+ return null;
1216
+ const includeUserMessage = options?.includeUserMessage ?? true;
1217
+ const cwd = options?.cwd ?? null;
1218
+ const normalizedType = normalizeCodexThreadItemType(typeof itemRecord.type === "string" ? itemRecord.type : undefined);
1219
+ const normalizedItem = normalizedType && normalizedType !== itemRecord.type
1220
+ ? { ...itemRecord, type: normalizedType }
1221
+ : itemRecord;
1222
+ if (normalizedType === "imageView" || normalizedType === "imageGeneration") {
1223
+ return mapCodexThreadImageItem(normalizedType, normalizedItem);
1224
+ }
1225
+ if (normalizedType && CODEX_TOOL_THREAD_ITEM_TYPES.has(normalizedType)) {
1226
+ return mapCodexToolCallFromThreadItem(normalizedItem, { cwd });
1227
+ }
1228
+ switch (normalizedType) {
1229
+ case "userMessage":
1230
+ return mapCodexThreadUserMessageItem(normalizedItem, includeUserMessage);
1231
+ case "agentMessage": {
1232
+ const messageId = nonEmptyString(normalizedItem.id);
1233
+ return {
1234
+ type: "assistant_message",
1235
+ text: typeof normalizedItem.text === "string" ? normalizedItem.text : "",
1236
+ ...(messageId ? { messageId } : {}),
1237
+ };
1238
+ }
1239
+ case "plan":
1240
+ return mapCodexThreadPlanItem(normalizedItem);
1241
+ case "reasoning":
1242
+ return mapCodexThreadReasoningItem(normalizedItem);
1243
+ case CODEX_CONTEXT_COMPACTION_TYPE:
1244
+ return {
1245
+ type: "compaction",
1246
+ status: "completed",
1247
+ };
1248
+ default:
1249
+ return null;
1250
+ }
1251
+ }
1252
+ const CodexThreadReadResponseSchema = z
1253
+ .object({
1254
+ thread: z
1255
+ .object({
1256
+ turns: z
1257
+ .array(z
1258
+ .object({
1259
+ items: z.array(z.unknown()).default([]),
1260
+ })
1261
+ .passthrough())
1262
+ .default([]),
1263
+ })
1264
+ .passthrough()
1265
+ .default({ turns: [] }),
1266
+ })
1267
+ .passthrough();
1268
+ async function requestCodexThreadHistory(requestThread, threadId) {
1269
+ const response = await requestThread(threadId);
1270
+ return CodexThreadReadResponseSchema.parse(response);
1271
+ }
1272
+ async function loadCodexThreadHistoryTimeline(params) {
1273
+ const response = await requestCodexThreadHistory(params.requestThread, params.threadId);
1274
+ const timeline = [];
1275
+ for (const turn of response.thread.turns) {
1276
+ for (const item of turn.items) {
1277
+ const timelineItem = threadItemToTimeline(item, { cwd: params.cwd });
1278
+ if (timelineItem) {
1279
+ const timestamp = readCodexHistoryTimestamp(item) ?? readCodexTurnHistoryTimestamp(turn, timelineItem);
1280
+ timeline.push({
1281
+ item: timelineItem,
1282
+ timestamp: timestamp ?? undefined,
1283
+ });
1284
+ }
1285
+ }
1286
+ }
1287
+ return timeline;
1288
+ }
1289
+ function readCodexThread(client, threadId) {
1290
+ return client.request("thread/read", {
1291
+ threadId,
1292
+ includeTurns: true,
1293
+ });
1294
+ }
1295
+ function toSandboxPolicy(type, networkAccess) {
1296
+ switch (type) {
1297
+ case "read-only":
1298
+ return { type: "readOnly" };
1299
+ case "workspace-write":
1300
+ return { type: "workspaceWrite", networkAccess: networkAccess ?? false };
1301
+ case "danger-full-access":
1302
+ return { type: "dangerFullAccess" };
1303
+ default:
1304
+ return { type: "workspaceWrite", networkAccess: networkAccess ?? false };
1305
+ }
1306
+ }
1307
+ function getImageExtension(mimeType) {
1308
+ switch (mimeType) {
1309
+ case "image/jpeg":
1310
+ return "jpg";
1311
+ case "image/png":
1312
+ return "png";
1313
+ case "image/webp":
1314
+ return "webp";
1315
+ case "image/gif":
1316
+ return "gif";
1317
+ case "image/bmp":
1318
+ return "bmp";
1319
+ case "image/tiff":
1320
+ return "tiff";
1321
+ default:
1322
+ return "bin";
1323
+ }
1324
+ }
1325
+ function normalizeImageData(mimeType, data) {
1326
+ if (data.startsWith("data:")) {
1327
+ const match = data.match(/^data:([^;]+);base64,(.*)$/);
1328
+ if (match) {
1329
+ return { mimeType: match[1], data: match[2] };
1330
+ }
1331
+ }
1332
+ return { mimeType, data };
1333
+ }
1334
+ const ThreadStartedNotificationSchema = z
1335
+ .object({
1336
+ thread: z.object({ id: z.string() }).passthrough(),
1337
+ })
1338
+ .passthrough();
1339
+ const TurnStartedNotificationSchema = z
1340
+ .object({
1341
+ threadId: z.string().optional(),
1342
+ turn: z.object({ id: z.string() }).passthrough(),
1343
+ })
1344
+ .passthrough();
1345
+ const TurnCompletedNotificationSchema = z
1346
+ .object({
1347
+ threadId: z.string().optional(),
1348
+ turn: z
1349
+ .object({
1350
+ status: z.string(),
1351
+ error: z
1352
+ .object({
1353
+ message: z.string().optional(),
1354
+ })
1355
+ .passthrough()
1356
+ .nullable()
1357
+ .optional(),
1358
+ })
1359
+ .passthrough(),
1360
+ })
1361
+ .passthrough();
1362
+ const TurnPlanUpdatedNotificationSchema = z
1363
+ .object({
1364
+ plan: z.array(z
1365
+ .object({
1366
+ step: z.string().optional(),
1367
+ status: z.string().optional(),
1368
+ })
1369
+ .passthrough()),
1370
+ })
1371
+ .passthrough();
1372
+ const TurnDiffUpdatedNotificationSchema = z
1373
+ .object({
1374
+ diff: z.string(),
1375
+ })
1376
+ .passthrough();
1377
+ const ThreadTokenUsageUpdatedNotificationSchema = z
1378
+ .object({
1379
+ tokenUsage: z.unknown(),
1380
+ })
1381
+ .passthrough();
1382
+ const ItemTextDeltaNotificationSchema = z
1383
+ .object({
1384
+ threadId: z.string().optional(),
1385
+ itemId: z.string(),
1386
+ delta: z.string(),
1387
+ })
1388
+ .passthrough();
1389
+ const ItemLifecycleNotificationSchema = z
1390
+ .object({
1391
+ threadId: z.string().optional(),
1392
+ item: z
1393
+ .object({
1394
+ id: z.string().optional(),
1395
+ type: z.string().optional(),
1396
+ })
1397
+ .passthrough(),
1398
+ })
1399
+ .passthrough();
1400
+ const ContextCompactedNotificationSchema = z
1401
+ .object({
1402
+ threadId: z.string(),
1403
+ turnId: z.string().optional(),
1404
+ })
1405
+ .passthrough();
1406
+ const CodexEventTurnAbortedNotificationSchema = z
1407
+ .object({
1408
+ msg: z
1409
+ .object({
1410
+ type: z.literal("turn_aborted"),
1411
+ reason: z.string().optional(),
1412
+ })
1413
+ .passthrough(),
1414
+ })
1415
+ .passthrough();
1416
+ const CodexEventTaskCompleteNotificationSchema = z
1417
+ .object({
1418
+ msg: z
1419
+ .object({
1420
+ type: z.literal("task_complete"),
1421
+ })
1422
+ .passthrough(),
1423
+ })
1424
+ .passthrough();
1425
+ const CodexEventItemLifecycleNotificationSchema = z
1426
+ .object({
1427
+ threadId: z.string().optional(),
1428
+ msg: z
1429
+ .object({
1430
+ type: z.enum(["item_started", "item_completed"]),
1431
+ threadId: z.string().optional(),
1432
+ thread_id: z.string().optional(),
1433
+ item: z
1434
+ .object({
1435
+ id: z.string().optional(),
1436
+ type: z.string().optional(),
1437
+ })
1438
+ .passthrough(),
1439
+ })
1440
+ .passthrough(),
1441
+ })
1442
+ .passthrough();
1443
+ const CodexEventExecCommandBeginNotificationSchema = z
1444
+ .object({
1445
+ msg: z
1446
+ .object({
1447
+ type: z.literal("exec_command_begin"),
1448
+ call_id: z.string().optional(),
1449
+ command: z.unknown().optional(),
1450
+ cwd: z.string().optional(),
1451
+ })
1452
+ .passthrough(),
1453
+ })
1454
+ .passthrough();
1455
+ const CodexEventExecCommandEndNotificationSchema = z
1456
+ .object({
1457
+ msg: z
1458
+ .object({
1459
+ type: z.literal("exec_command_end"),
1460
+ call_id: z.string().optional(),
1461
+ command: z.unknown().optional(),
1462
+ cwd: z.string().optional(),
1463
+ stdout: z.string().optional(),
1464
+ stderr: z.string().optional(),
1465
+ aggregated_output: z.string().optional(),
1466
+ aggregatedOutput: z.string().optional(),
1467
+ formatted_output: z.string().optional(),
1468
+ exit_code: z.number().nullable().optional(),
1469
+ exitCode: z.number().nullable().optional(),
1470
+ success: z.boolean().optional(),
1471
+ })
1472
+ .passthrough(),
1473
+ })
1474
+ .passthrough();
1475
+ const CodexEventExecCommandOutputDeltaNotificationSchema = z
1476
+ .object({
1477
+ msg: z
1478
+ .object({
1479
+ type: z.literal("exec_command_output_delta"),
1480
+ call_id: z.string().optional(),
1481
+ stream: z.string().optional(),
1482
+ chunk: z.string().optional(),
1483
+ delta: z.string().optional(),
1484
+ })
1485
+ .passthrough(),
1486
+ })
1487
+ .passthrough();
1488
+ const CodexEventTerminalInteractionNotificationSchema = z
1489
+ .object({
1490
+ msg: z
1491
+ .object({
1492
+ type: z.literal("terminal_interaction"),
1493
+ call_id: z.string().optional(),
1494
+ process_id: z.union([z.string(), z.number()]).optional(),
1495
+ stdin: z.string().optional(),
1496
+ })
1497
+ .passthrough(),
1498
+ })
1499
+ .passthrough();
1500
+ const ItemCommandExecutionTerminalInteractionNotificationSchema = z
1501
+ .object({
1502
+ itemId: z.string().optional(),
1503
+ processId: z.union([z.string(), z.number()]).optional(),
1504
+ stdin: z.string().optional(),
1505
+ })
1506
+ .passthrough();
1507
+ const CodexEventPatchApplyBeginNotificationSchema = z
1508
+ .object({
1509
+ msg: z
1510
+ .object({
1511
+ type: z.literal("patch_apply_begin"),
1512
+ call_id: z.string().optional(),
1513
+ changes: z.unknown().optional(),
1514
+ })
1515
+ .passthrough(),
1516
+ })
1517
+ .passthrough();
1518
+ const CodexEventPatchApplyEndNotificationSchema = z
1519
+ .object({
1520
+ msg: z
1521
+ .object({
1522
+ type: z.literal("patch_apply_end"),
1523
+ call_id: z.string().optional(),
1524
+ changes: z.unknown().optional(),
1525
+ stdout: z.string().optional(),
1526
+ stderr: z.string().optional(),
1527
+ success: z.boolean().optional(),
1528
+ })
1529
+ .passthrough(),
1530
+ })
1531
+ .passthrough();
1532
+ const ItemFileChangeOutputDeltaNotificationSchema = z
1533
+ .object({
1534
+ itemId: z.string(),
1535
+ delta: z.string().optional(),
1536
+ chunk: z.string().optional(),
1537
+ })
1538
+ .passthrough();
1539
+ const CodexEventTurnDiffNotificationSchema = z
1540
+ .object({
1541
+ msg: z
1542
+ .object({
1543
+ type: z.literal("turn_diff"),
1544
+ unified_diff: z.string().optional(),
1545
+ diff: z.string().optional(),
1546
+ })
1547
+ .passthrough(),
1548
+ })
1549
+ .passthrough();
1550
+ const CodexNotificationSchema = z.union([
1551
+ z
1552
+ .object({ method: z.literal("thread/started"), params: ThreadStartedNotificationSchema })
1553
+ .transform(({ params }) => ({
1554
+ kind: "thread_started",
1555
+ threadId: params.thread.id,
1556
+ })),
1557
+ z.object({ method: z.literal("thread/started"), params: z.unknown() }).transform(({ method, params }) => ({
1558
+ kind: "invalid_payload",
1559
+ method,
1560
+ params,
1561
+ })),
1562
+ z.object({ method: z.literal("turn/started"), params: TurnStartedNotificationSchema }).transform(({ params }) => ({
1563
+ kind: "turn_started",
1564
+ turnId: params.turn.id,
1565
+ threadId: params.threadId ?? null,
1566
+ })),
1567
+ z.object({ method: z.literal("turn/started"), params: z.unknown() }).transform(({ method, params }) => ({
1568
+ kind: "invalid_payload",
1569
+ method,
1570
+ params,
1571
+ })),
1572
+ z
1573
+ .object({ method: z.literal("turn/completed"), params: TurnCompletedNotificationSchema })
1574
+ .transform(({ params }) => ({
1575
+ kind: "turn_completed",
1576
+ status: params.turn.status,
1577
+ errorMessage: params.turn.error?.message ?? null,
1578
+ threadId: params.threadId ?? null,
1579
+ })),
1580
+ z.object({ method: z.literal("turn/completed"), params: z.unknown() }).transform(({ method, params }) => ({
1581
+ kind: "invalid_payload",
1582
+ method,
1583
+ params,
1584
+ })),
1585
+ z
1586
+ .object({ method: z.literal("turn/plan/updated"), params: TurnPlanUpdatedNotificationSchema })
1587
+ .transform(({ params }) => ({
1588
+ kind: "plan_updated",
1589
+ plan: params.plan.map((entry) => ({
1590
+ step: entry.step ?? null,
1591
+ status: entry.status ?? null,
1592
+ })),
1593
+ })),
1594
+ z.object({ method: z.literal("turn/plan/updated"), params: z.unknown() }).transform(({ method, params }) => ({
1595
+ kind: "invalid_payload",
1596
+ method,
1597
+ params,
1598
+ })),
1599
+ z
1600
+ .object({ method: z.literal("turn/diff/updated"), params: TurnDiffUpdatedNotificationSchema })
1601
+ .transform(({ params }) => ({ kind: "diff_updated", diff: params.diff })),
1602
+ z.object({ method: z.literal("turn/diff/updated"), params: z.unknown() }).transform(({ method, params }) => ({
1603
+ kind: "invalid_payload",
1604
+ method,
1605
+ params,
1606
+ })),
1607
+ z
1608
+ .object({
1609
+ method: z.literal("thread/tokenUsage/updated"),
1610
+ params: ThreadTokenUsageUpdatedNotificationSchema,
1611
+ })
1612
+ .transform(({ params }) => ({
1613
+ kind: "token_usage_updated",
1614
+ tokenUsage: params.tokenUsage,
1615
+ })),
1616
+ z.object({ method: z.literal("thread/tokenUsage/updated"), params: z.unknown() }).transform(({ method, params }) => ({
1617
+ kind: "invalid_payload",
1618
+ method,
1619
+ params,
1620
+ })),
1621
+ z
1622
+ .object({ method: z.literal("thread/compacted"), params: ContextCompactedNotificationSchema })
1623
+ .transform(({ params }) => ({
1624
+ kind: "context_compacted",
1625
+ threadId: params.threadId,
1626
+ turnId: params.turnId ?? null,
1627
+ })),
1628
+ z.object({ method: z.literal("thread/compacted"), params: z.unknown() }).transform(({ method, params }) => ({
1629
+ kind: "invalid_payload",
1630
+ method,
1631
+ params,
1632
+ })),
1633
+ z
1634
+ .object({
1635
+ method: z.literal("item/agentMessage/delta"),
1636
+ params: ItemTextDeltaNotificationSchema,
1637
+ })
1638
+ .transform(({ params }) => ({
1639
+ kind: "agent_message_delta",
1640
+ itemId: params.itemId,
1641
+ delta: params.delta,
1642
+ threadId: params.threadId ?? null,
1643
+ })),
1644
+ z.object({ method: z.literal("item/agentMessage/delta"), params: z.unknown() }).transform(({ method, params }) => ({
1645
+ kind: "invalid_payload",
1646
+ method,
1647
+ params,
1648
+ })),
1649
+ z
1650
+ .object({
1651
+ method: z.literal("item/reasoning/summaryTextDelta"),
1652
+ params: ItemTextDeltaNotificationSchema,
1653
+ })
1654
+ .transform(({ params }) => ({
1655
+ kind: "reasoning_delta",
1656
+ itemId: params.itemId,
1657
+ delta: params.delta,
1658
+ threadId: params.threadId ?? null,
1659
+ })),
1660
+ z.object({ method: z.literal("item/reasoning/summaryTextDelta"), params: z.unknown() }).transform(({ method, params }) => ({
1661
+ kind: "invalid_payload",
1662
+ method,
1663
+ params,
1664
+ })),
1665
+ z
1666
+ .object({ method: z.literal("item/completed"), params: ItemLifecycleNotificationSchema })
1667
+ .transform(({ params }) => ({
1668
+ kind: "item_completed",
1669
+ source: "item",
1670
+ threadId: params.threadId ?? null,
1671
+ item: params.item,
1672
+ })),
1673
+ z.object({ method: z.literal("item/completed"), params: z.unknown() }).transform(({ method, params }) => ({
1674
+ kind: "invalid_payload",
1675
+ method,
1676
+ params,
1677
+ })),
1678
+ z
1679
+ .object({ method: z.literal("item/started"), params: ItemLifecycleNotificationSchema })
1680
+ .transform(({ params }) => ({
1681
+ kind: "item_started",
1682
+ source: "item",
1683
+ threadId: params.threadId ?? null,
1684
+ item: params.item,
1685
+ })),
1686
+ z.object({ method: z.literal("item/started"), params: z.unknown() }).transform(({ method, params }) => ({
1687
+ kind: "invalid_payload",
1688
+ method,
1689
+ params,
1690
+ })),
1691
+ z
1692
+ .object({
1693
+ method: z.literal("codex/event/item_started"),
1694
+ params: CodexEventItemLifecycleNotificationSchema,
1695
+ })
1696
+ .transform(({ params }) => ({
1697
+ kind: "item_started",
1698
+ source: "codex_event",
1699
+ threadId: params.threadId ?? params.msg.threadId ?? params.msg.thread_id ?? null,
1700
+ item: params.msg.item,
1701
+ })),
1702
+ z.object({ method: z.literal("codex/event/item_started"), params: z.unknown() }).transform(({ method, params }) => ({
1703
+ kind: "invalid_payload",
1704
+ method,
1705
+ params,
1706
+ })),
1707
+ z
1708
+ .object({
1709
+ method: z.literal("codex/event/item_completed"),
1710
+ params: CodexEventItemLifecycleNotificationSchema,
1711
+ })
1712
+ .transform(({ params }) => ({
1713
+ kind: "item_completed",
1714
+ source: "codex_event",
1715
+ threadId: params.threadId ?? params.msg.threadId ?? params.msg.thread_id ?? null,
1716
+ item: params.msg.item,
1717
+ })),
1718
+ z.object({ method: z.literal("codex/event/item_completed"), params: z.unknown() }).transform(({ method, params }) => ({
1719
+ kind: "invalid_payload",
1720
+ method,
1721
+ params,
1722
+ })),
1723
+ z
1724
+ .object({
1725
+ method: z.literal("codex/event/exec_command_begin"),
1726
+ params: CodexEventExecCommandBeginNotificationSchema,
1727
+ })
1728
+ .transform(({ params }) => ({
1729
+ kind: "exec_command_started",
1730
+ callId: params.msg.call_id ?? null,
1731
+ command: params.msg.command ?? null,
1732
+ cwd: params.msg.cwd ?? null,
1733
+ })),
1734
+ z.object({ method: z.literal("codex/event/exec_command_begin"), params: z.unknown() }).transform(({ method, params }) => ({
1735
+ kind: "invalid_payload",
1736
+ method,
1737
+ params,
1738
+ })),
1739
+ z
1740
+ .object({
1741
+ method: z.literal("codex/event/exec_command_end"),
1742
+ params: CodexEventExecCommandEndNotificationSchema,
1743
+ })
1744
+ .transform(({ params }) => ({
1745
+ kind: "exec_command_completed",
1746
+ callId: params.msg.call_id ?? null,
1747
+ command: params.msg.command ?? null,
1748
+ cwd: params.msg.cwd ?? null,
1749
+ output: params.msg.aggregated_output ??
1750
+ params.msg.aggregatedOutput ??
1751
+ params.msg.formatted_output ??
1752
+ params.msg.stdout ??
1753
+ null,
1754
+ exitCode: params.msg.exit_code ?? params.msg.exitCode ?? null,
1755
+ success: params.msg.success ?? null,
1756
+ stderr: params.msg.stderr ?? null,
1757
+ })),
1758
+ z.object({ method: z.literal("codex/event/exec_command_end"), params: z.unknown() }).transform(({ method, params }) => ({
1759
+ kind: "invalid_payload",
1760
+ method,
1761
+ params,
1762
+ })),
1763
+ z
1764
+ .object({
1765
+ method: z.literal("codex/event/exec_command_output_delta"),
1766
+ params: CodexEventExecCommandOutputDeltaNotificationSchema,
1767
+ })
1768
+ .transform(({ params }) => ({
1769
+ kind: "exec_command_output_delta",
1770
+ callId: params.msg.call_id ?? null,
1771
+ stream: params.msg.stream ?? null,
1772
+ chunk: params.msg.chunk ?? params.msg.delta ?? null,
1773
+ })),
1774
+ z
1775
+ .object({
1776
+ method: z.literal("codex/event/exec_command_output_delta"),
1777
+ params: z.unknown(),
1778
+ })
1779
+ .transform(({ method, params }) => ({
1780
+ kind: "invalid_payload",
1781
+ method,
1782
+ params,
1783
+ })),
1784
+ z
1785
+ .object({
1786
+ method: z.literal("codex/event/terminal_interaction"),
1787
+ params: CodexEventTerminalInteractionNotificationSchema,
1788
+ })
1789
+ .transform(({ params }) => ({
1790
+ kind: "terminal_interaction",
1791
+ source: "codex_event",
1792
+ callId: params.msg.call_id ?? null,
1793
+ processId: typeof params.msg.process_id === "number"
1794
+ ? String(params.msg.process_id)
1795
+ : (params.msg.process_id ?? null),
1796
+ stdin: params.msg.stdin ?? null,
1797
+ })),
1798
+ z
1799
+ .object({ method: z.literal("codex/event/terminal_interaction"), params: z.unknown() })
1800
+ .transform(({ method, params }) => ({
1801
+ kind: "invalid_payload",
1802
+ method,
1803
+ params,
1804
+ })),
1805
+ z
1806
+ .object({
1807
+ method: z.literal("item/commandExecution/terminalInteraction"),
1808
+ params: ItemCommandExecutionTerminalInteractionNotificationSchema,
1809
+ })
1810
+ .transform(({ params }) => ({
1811
+ kind: "terminal_interaction",
1812
+ source: "item",
1813
+ callId: params.itemId ?? null,
1814
+ processId: typeof params.processId === "number"
1815
+ ? String(params.processId)
1816
+ : (params.processId ?? null),
1817
+ stdin: params.stdin ?? null,
1818
+ })),
1819
+ z
1820
+ .object({
1821
+ method: z.literal("item/commandExecution/terminalInteraction"),
1822
+ params: z.unknown(),
1823
+ })
1824
+ .transform(({ method, params }) => ({
1825
+ kind: "invalid_payload",
1826
+ method,
1827
+ params,
1828
+ })),
1829
+ z
1830
+ .object({
1831
+ method: z.literal("codex/event/patch_apply_begin"),
1832
+ params: CodexEventPatchApplyBeginNotificationSchema,
1833
+ })
1834
+ .transform(({ params }) => ({
1835
+ kind: "patch_apply_started",
1836
+ callId: params.msg.call_id ?? null,
1837
+ changes: params.msg.changes ?? null,
1838
+ })),
1839
+ z.object({ method: z.literal("codex/event/patch_apply_begin"), params: z.unknown() }).transform(({ method, params }) => ({
1840
+ kind: "invalid_payload",
1841
+ method,
1842
+ params,
1843
+ })),
1844
+ z
1845
+ .object({
1846
+ method: z.literal("codex/event/patch_apply_end"),
1847
+ params: CodexEventPatchApplyEndNotificationSchema,
1848
+ })
1849
+ .transform(({ params }) => ({
1850
+ kind: "patch_apply_completed",
1851
+ callId: params.msg.call_id ?? null,
1852
+ changes: params.msg.changes ?? null,
1853
+ stdout: params.msg.stdout ?? null,
1854
+ stderr: params.msg.stderr ?? null,
1855
+ success: params.msg.success ?? null,
1856
+ })),
1857
+ z.object({ method: z.literal("codex/event/patch_apply_end"), params: z.unknown() }).transform(({ method, params }) => ({
1858
+ kind: "invalid_payload",
1859
+ method,
1860
+ params,
1861
+ })),
1862
+ z
1863
+ .object({
1864
+ method: z.literal("item/fileChange/outputDelta"),
1865
+ params: ItemFileChangeOutputDeltaNotificationSchema,
1866
+ })
1867
+ .transform(({ params }) => ({
1868
+ kind: "file_change_output_delta",
1869
+ itemId: params.itemId,
1870
+ delta: params.delta ?? params.chunk ?? null,
1871
+ })),
1872
+ z.object({ method: z.literal("item/fileChange/outputDelta"), params: z.unknown() }).transform(({ method, params }) => ({
1873
+ kind: "invalid_payload",
1874
+ method,
1875
+ params,
1876
+ })),
1877
+ z
1878
+ .object({
1879
+ method: z.literal("codex/event/turn_diff"),
1880
+ params: CodexEventTurnDiffNotificationSchema,
1881
+ })
1882
+ .transform(({ params }) => ({
1883
+ kind: "diff_updated",
1884
+ diff: params.msg.unified_diff ?? params.msg.diff ?? "",
1885
+ })),
1886
+ z.object({ method: z.literal("codex/event/turn_diff"), params: z.unknown() }).transform(({ method, params }) => ({
1887
+ kind: "invalid_payload",
1888
+ method,
1889
+ params,
1890
+ })),
1891
+ z
1892
+ .object({
1893
+ method: z.literal("codex/event/turn_aborted"),
1894
+ params: CodexEventTurnAbortedNotificationSchema,
1895
+ })
1896
+ .transform(() => ({
1897
+ kind: "turn_completed",
1898
+ status: "interrupted",
1899
+ errorMessage: null,
1900
+ threadId: null,
1901
+ })),
1902
+ z.object({ method: z.literal("codex/event/turn_aborted"), params: z.unknown() }).transform(({ method, params }) => ({
1903
+ kind: "invalid_payload",
1904
+ method,
1905
+ params,
1906
+ })),
1907
+ z
1908
+ .object({
1909
+ method: z.literal("codex/event/task_complete"),
1910
+ params: CodexEventTaskCompleteNotificationSchema,
1911
+ })
1912
+ .transform(() => ({
1913
+ kind: "turn_completed",
1914
+ status: "completed",
1915
+ errorMessage: null,
1916
+ threadId: null,
1917
+ })),
1918
+ z.object({ method: z.literal("codex/event/task_complete"), params: z.unknown() }).transform(({ method, params }) => ({
1919
+ kind: "invalid_payload",
1920
+ method,
1921
+ params,
1922
+ })),
1923
+ z
1924
+ .object({ method: z.string(), params: z.unknown() })
1925
+ .transform(({ method, params }) => ({ kind: "unknown_method", method, params })),
1926
+ ]);
1927
+ async function writeImageAttachment(mimeType, data) {
1928
+ const attachmentsDir = path.join(os.tmpdir(), CODEX_IMAGE_ATTACHMENT_DIR);
1929
+ await fs.mkdir(attachmentsDir, { recursive: true });
1930
+ const normalized = normalizeImageData(mimeType, data);
1931
+ const extension = getImageExtension(normalized.mimeType);
1932
+ const filename = `${randomUUID()}.${extension}`;
1933
+ const filePath = path.join(attachmentsDir, filename);
1934
+ await fs.writeFile(filePath, Buffer.from(normalized.data, "base64"));
1935
+ return filePath;
1936
+ }
1937
+ async function readCodexConfiguredDefaults(client, logger) {
1938
+ let savedConfigDefaults = {};
1939
+ try {
1940
+ const response = toObjectRecord(await client.request("getUserSavedConfig", {}));
1941
+ const config = toObjectRecord(response?.config);
1942
+ const modelValue = typeof config?.model === "string" ? config.model : undefined;
1943
+ const thinkingOptionValue = typeof config?.modelReasoningEffort === "string" ? config.modelReasoningEffort : null;
1944
+ savedConfigDefaults = {
1945
+ model: normalizeCodexModelId(modelValue),
1946
+ thinkingOptionId: normalizeCodexThinkingOptionId(thinkingOptionValue),
1947
+ };
1948
+ }
1949
+ catch (error) {
1950
+ logger.debug({ error }, "Failed to read Codex saved config defaults");
1951
+ }
1952
+ if (savedConfigDefaults.model && savedConfigDefaults.thinkingOptionId) {
1953
+ return savedConfigDefaults;
1954
+ }
1955
+ let configReadDefaults = {};
1956
+ try {
1957
+ const response = toObjectRecord(await client.request("config/read", {}));
1958
+ const config = toObjectRecord(response?.config);
1959
+ const modelValue = typeof config?.model === "string" ? config.model : undefined;
1960
+ const thinkingOptionValue = typeof config?.model_reasoning_effort === "string" ? config.model_reasoning_effort : null;
1961
+ configReadDefaults = {
1962
+ model: normalizeCodexModelId(modelValue),
1963
+ thinkingOptionId: normalizeCodexThinkingOptionId(thinkingOptionValue),
1964
+ };
1965
+ }
1966
+ catch (error) {
1967
+ logger.debug({ error }, "Failed to read Codex config defaults");
1968
+ }
1969
+ return mergeCodexConfiguredDefaults(savedConfigDefaults, configReadDefaults);
1970
+ }
1971
+ export async function codexAppServerTurnInputFromPrompt(prompt, logger) {
1972
+ if (typeof prompt === "string") {
1973
+ return [toCodexTextInput(prompt)];
1974
+ }
1975
+ const output = [];
1976
+ let previousTextBlock = false;
1977
+ for (const block of prompt) {
1978
+ if (block.type === "text") {
1979
+ output.push(toCodexTextInput(block.text));
1980
+ previousTextBlock = block.text.length > 0;
1981
+ continue;
1982
+ }
1983
+ if (block.type === "skill") {
1984
+ output.push(block);
1985
+ previousTextBlock = false;
1986
+ continue;
1987
+ }
1988
+ if (block.type === "image") {
1989
+ try {
1990
+ const filePath = await writeImageAttachment(block.mimeType, block.data);
1991
+ output.push({ type: "localImage", path: filePath });
1992
+ }
1993
+ catch (error) {
1994
+ const message = error instanceof Error ? error.message : String(error);
1995
+ logger.warn({ message }, "Failed to write Codex image attachment");
1996
+ output.push({
1997
+ ...toCodexTextInput(`User attached image (failed to write temp file): ${message}`),
1998
+ });
1999
+ }
2000
+ previousTextBlock = false;
2001
+ continue;
2002
+ }
2003
+ const attachmentText = renderPromptAttachmentAsText(block);
2004
+ output.push(toCodexTextInput(previousTextBlock ? `\n\n${attachmentText}` : attachmentText));
2005
+ previousTextBlock = true;
2006
+ }
2007
+ return output;
2008
+ }
2009
+ function toCodexTextInput(text) {
2010
+ return {
2011
+ type: "text",
2012
+ text,
2013
+ text_elements: [],
2014
+ };
2015
+ }
2016
+ function buildCodexAppServerEnv(runtimeSettings, launchEnv) {
2017
+ return createProviderEnv({
2018
+ runtimeSettings,
2019
+ overlays: [launchEnv],
2020
+ });
2021
+ }
2022
+ function buildCodexAppServerInitializeParams() {
2023
+ return {
2024
+ clientInfo: {
2025
+ name: "paseo",
2026
+ title: "Paseo",
2027
+ version: "0.0.0",
2028
+ },
2029
+ capabilities: {
2030
+ experimentalApi: true,
2031
+ },
2032
+ };
2033
+ }
2034
+ function normalizeOpenAICompatibleBaseUrl(value) {
2035
+ const trimmed = value.trim();
2036
+ if (!trimmed) {
2037
+ return null;
2038
+ }
2039
+ const withoutTrailingSlashes = trimmed.replace(/\/+$/u, "");
2040
+ if (withoutTrailingSlashes.endsWith("/v1")) {
2041
+ return withoutTrailingSlashes;
2042
+ }
2043
+ return `${withoutTrailingSlashes}/v1`;
2044
+ }
2045
+ function buildCodexCustomProviderConfig(runtimeSettings, customProvider) {
2046
+ if (customProvider?.extends !== CODEX_PROVIDER) {
2047
+ return null;
2048
+ }
2049
+ const baseUrl = runtimeSettings?.env?.OPENAI_BASE_URL;
2050
+ if (typeof baseUrl !== "string") {
2051
+ return null;
2052
+ }
2053
+ const normalizedBaseUrl = normalizeOpenAICompatibleBaseUrl(baseUrl);
2054
+ if (!normalizedBaseUrl) {
2055
+ return null;
2056
+ }
2057
+ const providerConfig = {
2058
+ name: customProvider.label,
2059
+ base_url: normalizedBaseUrl,
2060
+ wire_api: "responses",
2061
+ };
2062
+ if (runtimeSettings?.env?.OPENAI_API_KEY?.trim()) {
2063
+ providerConfig.env_key = "OPENAI_API_KEY";
2064
+ providerConfig.requires_openai_auth = false;
2065
+ }
2066
+ return {
2067
+ model_provider: customProvider.id,
2068
+ model_providers: {
2069
+ [customProvider.id]: providerConfig,
2070
+ },
2071
+ };
2072
+ }
2073
+ class CodexAppServerAgentSession {
2074
+ constructor(config, resumeHandle, logger, spawnAppServer, deps = {}, ephemeral = false, goalsEnabled = false, autoReviewEnabled = false, agentId) {
2075
+ this.resumeHandle = resumeHandle;
2076
+ this.spawnAppServer = spawnAppServer;
2077
+ this.deps = deps;
2078
+ this.ephemeral = ephemeral;
2079
+ this.goalsEnabled = goalsEnabled;
2080
+ this.autoReviewEnabled = autoReviewEnabled;
2081
+ this.agentId = agentId;
2082
+ this.provider = CODEX_PROVIDER;
2083
+ this.capabilities = CODEX_APP_SERVER_CAPABILITIES;
2084
+ this.currentThreadId = null;
2085
+ this.currentTurnId = null;
2086
+ this.client = null;
2087
+ this.subscribers = new Set();
2088
+ this.nextTurnOrdinal = 0;
2089
+ this.activeForegroundTurnId = null;
2090
+ this.cachedRuntimeInfo = null;
2091
+ this.serviceTier = null;
2092
+ this.planModeEnabled = false;
2093
+ this.historyPending = false;
2094
+ this.persistedHistory = [];
2095
+ this.pendingPermissions = new Map();
2096
+ this.pendingPermissionHandlers = new Map();
2097
+ this.resolvedPermissionRequests = new Set();
2098
+ this.pendingAgentMessages = new Map();
2099
+ this.pendingReasoning = new Map();
2100
+ this.pendingCommandOutputDeltas = new Map();
2101
+ this.pendingFileChangeOutputDeltas = new Map();
2102
+ this.pendingAssistantMessageBoundary = false;
2103
+ this.terminalCommandByProcessId = new Map();
2104
+ this.pendingUnlabeledTerminalInteractions = new Set();
2105
+ this.emittedTerminalInteractionKeys = new Set();
2106
+ this.emittedExecCommandStartedCallIds = new Set();
2107
+ this.emittedExecCommandCompletedCallIds = new Set();
2108
+ this.emittedItemStartedIds = new Set();
2109
+ this.emittedItemCompletedIds = new Set();
2110
+ this.subAgentCallsByCallId = new Map();
2111
+ this.subAgentCallIdByChildThreadId = new Map();
2112
+ this.warnedUnknownNotificationMethods = new Set();
2113
+ this.warnedInvalidNotificationPayloads = new Set();
2114
+ this.warnedIncompleteEditToolCallIds = new Set();
2115
+ this.latestPlanResult = null;
2116
+ this.pendingManualCompactionStarts = 0;
2117
+ this.compactionTriggerByItemId = new Map();
2118
+ // Codex can report one completed compaction through both channels:
2119
+ // `thread/compacted` and a completed `contextCompaction` item.
2120
+ this.unpairedCompactionNotificationCompletions = 0;
2121
+ this.unpairedCompactionItemCompletions = 0;
2122
+ this.connected = false;
2123
+ this.collaborationModes = [];
2124
+ this.resolvedCollaborationMode = null;
2125
+ this.cachedSkills = [];
2126
+ this.logger = logger.child({
2127
+ module: "agent",
2128
+ provider: CODEX_PROVIDER,
2129
+ agentId: this.agentId,
2130
+ });
2131
+ if (config.modeId === undefined) {
2132
+ throw new Error("Codex agent requires modeId to be specified");
2133
+ }
2134
+ validateCodexMode(config.modeId);
2135
+ this.currentMode = config.modeId;
2136
+ this.config = config;
2137
+ this.config.thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
2138
+ if (this.config.featureValues?.fast_mode && codexModelSupportsFastMode(this.config.model)) {
2139
+ this.serviceTier = "fast";
2140
+ }
2141
+ if (this.config.featureValues?.plan_mode) {
2142
+ this.planModeEnabled = true;
2143
+ }
2144
+ if (this.resumeHandle?.sessionId) {
2145
+ this.currentThreadId = this.resumeHandle.sessionId;
2146
+ this.historyPending = true;
2147
+ }
2148
+ }
2149
+ get id() {
2150
+ return this.currentThreadId;
2151
+ }
2152
+ get features() {
2153
+ return buildCodexFeatures({
2154
+ modelId: this.config.model,
2155
+ fastModeEnabled: this.serviceTier === "fast",
2156
+ planModeEnabled: this.planModeEnabled,
2157
+ planModeAvailable: this.hasPlanCollaborationMode(),
2158
+ });
2159
+ }
2160
+ async connect() {
2161
+ if (this.connected)
2162
+ return;
2163
+ const child = await this.spawnAppServer();
2164
+ this.client = new CodexAppServerClient(child, this.logger, () => this.traceContext());
2165
+ this.client.setNotificationHandler((method, params) => this.handleNotification(method, params));
2166
+ this.registerRequestHandlers();
2167
+ await this.client.request("initialize", buildCodexAppServerInitializeParams());
2168
+ this.client.notify("initialized", {});
2169
+ await this.loadCollaborationModes();
2170
+ await this.loadSkills();
2171
+ if (this.currentThreadId) {
2172
+ await this.ensureThreadLoaded();
2173
+ await this.loadPersistedHistory();
2174
+ }
2175
+ this.connected = true;
2176
+ }
2177
+ traceContext() {
2178
+ return {
2179
+ agentId: this.agentId,
2180
+ sessionId: this.currentThreadId ?? undefined,
2181
+ turnId: this.activeForegroundTurnId ?? undefined,
2182
+ };
2183
+ }
2184
+ async loadCollaborationModes() {
2185
+ if (!this.client)
2186
+ return;
2187
+ try {
2188
+ const response = toObjectRecord(await this.client.request("collaborationMode/list", {}));
2189
+ const data = Array.isArray(response?.data) ? response.data : [];
2190
+ this.collaborationModes = data.map((entry) => {
2191
+ const record = toObjectRecord(entry);
2192
+ return {
2193
+ name: typeof record?.name === "string" ? record.name : "",
2194
+ mode: typeof record?.mode === "string" ? record.mode : null,
2195
+ model: typeof record?.model === "string" ? record.model : null,
2196
+ reasoning_effort: typeof record?.reasoning_effort === "string" ? record.reasoning_effort : null,
2197
+ developer_instructions: typeof record?.developer_instructions === "string"
2198
+ ? record.developer_instructions
2199
+ : null,
2200
+ };
2201
+ });
2202
+ }
2203
+ catch (error) {
2204
+ this.logger.trace({
2205
+ agentId: this.agentId,
2206
+ provider: CODEX_PROVIDER,
2207
+ sessionId: this.currentThreadId,
2208
+ turnId: this.activeForegroundTurnId ?? undefined,
2209
+ error,
2210
+ }, "provider.codex.metadata.collaboration_modes_failed");
2211
+ this.collaborationModes = [];
2212
+ }
2213
+ this.refreshResolvedCollaborationMode();
2214
+ }
2215
+ async loadSkills() {
2216
+ if (!this.client)
2217
+ return;
2218
+ try {
2219
+ const response = toObjectRecord(await this.client.request("skills/list", {
2220
+ cwd: [this.config.cwd],
2221
+ }));
2222
+ const entries = Array.isArray(response?.data) ? response.data : [];
2223
+ const skillsByName = new Map();
2224
+ for (const entry of entries) {
2225
+ const entryRecord = toObjectRecord(entry);
2226
+ const list = Array.isArray(entryRecord?.skills) ? entryRecord.skills : [];
2227
+ for (const skill of list) {
2228
+ const skillRecord = toObjectRecord(skill);
2229
+ if (typeof skillRecord?.name !== "string" || typeof skillRecord?.path !== "string")
2230
+ continue;
2231
+ if (!skillsByName.has(skillRecord.name)) {
2232
+ skillsByName.set(skillRecord.name, {
2233
+ name: skillRecord.name,
2234
+ description: resolveSkillDescription(skillRecord),
2235
+ path: skillRecord.path,
2236
+ });
2237
+ }
2238
+ }
2239
+ }
2240
+ this.cachedSkills = Array.from(skillsByName.values());
2241
+ }
2242
+ catch (error) {
2243
+ this.logger.trace({
2244
+ agentId: this.agentId,
2245
+ provider: CODEX_PROVIDER,
2246
+ sessionId: this.currentThreadId,
2247
+ turnId: this.activeForegroundTurnId ?? undefined,
2248
+ error,
2249
+ }, "provider.codex.metadata.skills_failed");
2250
+ this.cachedSkills = [];
2251
+ }
2252
+ }
2253
+ findCollaborationMode(target) {
2254
+ if (this.collaborationModes.length === 0)
2255
+ return null;
2256
+ const findByName = (predicate) => this.collaborationModes.find((entry) => predicate(entry.name.toLowerCase()));
2257
+ if (target === "plan") {
2258
+ return findByName((name) => name.includes("plan") || name.includes("read")) ?? null;
2259
+ }
2260
+ return (findByName((name) => name.includes("auto") || name.includes("code")) ??
2261
+ this.collaborationModes.find((entry) => {
2262
+ const name = entry.name.toLowerCase();
2263
+ return !name.includes("plan") && !name.includes("read");
2264
+ }) ??
2265
+ this.collaborationModes[0] ??
2266
+ null);
2267
+ }
2268
+ hasPlanCollaborationMode() {
2269
+ return this.findCollaborationMode("plan") !== null;
2270
+ }
2271
+ resolveCollaborationMode() {
2272
+ const match = this.findCollaborationMode(this.planModeEnabled ? "plan" : "code");
2273
+ if (!match)
2274
+ return null;
2275
+ const settings = {};
2276
+ if (match.model)
2277
+ settings.model = match.model;
2278
+ if (match.reasoning_effort)
2279
+ settings.reasoning_effort = match.reasoning_effort;
2280
+ const developerInstructions = composeSystemPromptParts(match.developer_instructions, this.config.systemPrompt, this.config.daemonAppendSystemPrompt);
2281
+ if (developerInstructions)
2282
+ settings.developer_instructions = developerInstructions;
2283
+ if (this.config.model)
2284
+ settings.model = this.config.model;
2285
+ const thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
2286
+ if (thinkingOptionId)
2287
+ settings.reasoning_effort = thinkingOptionId;
2288
+ return { mode: match.mode ?? "code", settings, name: match.name };
2289
+ }
2290
+ refreshResolvedCollaborationMode() {
2291
+ this.resolvedCollaborationMode = this.resolveCollaborationMode();
2292
+ }
2293
+ applyFeatureValue(featureId, value) {
2294
+ this.config.featureValues = {
2295
+ ...this.config.featureValues,
2296
+ [featureId]: value,
2297
+ };
2298
+ if (featureId === "fast_mode") {
2299
+ this.serviceTier = value ? "fast" : null;
2300
+ this.cachedRuntimeInfo = null;
2301
+ return;
2302
+ }
2303
+ this.planModeEnabled = value;
2304
+ this.refreshResolvedCollaborationMode();
2305
+ this.cachedRuntimeInfo = null;
2306
+ }
2307
+ rememberPlanResult(item) {
2308
+ if (item.detail.type !== "plan") {
2309
+ return;
2310
+ }
2311
+ this.latestPlanResult = {
2312
+ callId: item.callId,
2313
+ text: item.detail.text,
2314
+ turnId: this.currentTurnId,
2315
+ };
2316
+ }
2317
+ emitSyntheticPlanApprovalRequest(planText) {
2318
+ const requestId = `permission-${randomUUID()}`;
2319
+ const request = {
2320
+ id: requestId,
2321
+ provider: CODEX_PROVIDER,
2322
+ name: "CodexPlanApproval",
2323
+ kind: "plan",
2324
+ title: "Plan",
2325
+ description: "Review the proposed plan before implementation starts.",
2326
+ input: { plan: planText },
2327
+ actions: buildPlanPermissionActions(),
2328
+ metadata: {
2329
+ planText,
2330
+ source: "codex_plan_approval",
2331
+ },
2332
+ };
2333
+ this.pendingPermissions.set(requestId, request);
2334
+ this.pendingPermissionHandlers.set(requestId, {
2335
+ resolve: () => undefined,
2336
+ kind: "plan",
2337
+ planText,
2338
+ });
2339
+ this.emitEvent({ type: "permission_requested", provider: CODEX_PROVIDER, request });
2340
+ }
2341
+ /**
2342
+ * Prepare the session for plan implementation by disabling plan mode
2343
+ * and returning the implementation prompt. The caller is responsible for
2344
+ * starting the turn through the normal streamAgent path.
2345
+ */
2346
+ preparePlanImplementation(params) {
2347
+ const planText = typeof params.planText === "string" ? normalizePlanMarkdown(params.planText) : "";
2348
+ this.applyFeatureValue("plan_mode", false);
2349
+ return buildCodexPlanImplementationPrompt(planText);
2350
+ }
2351
+ registerRequestHandlers() {
2352
+ if (!this.client)
2353
+ return;
2354
+ this.client.setRequestHandler("item/commandExecution/requestApproval", (params) => this.handleCommandApprovalRequest(params));
2355
+ this.client.setRequestHandler("item/fileChange/requestApproval", (params) => this.handleFileChangeApprovalRequest(params));
2356
+ this.client.setRequestHandler("item/tool/requestUserInput", (params) => this.handleToolApprovalRequest(params));
2357
+ // Keep the legacy method name for older Codex builds.
2358
+ this.client.setRequestHandler("tool/requestUserInput", (params) => this.handleToolApprovalRequest(params));
2359
+ }
2360
+ async loadPersistedHistory() {
2361
+ if (!this.client || !this.currentThreadId)
2362
+ return;
2363
+ const client = this.client;
2364
+ const threadId = this.currentThreadId;
2365
+ try {
2366
+ const timeline = await loadCodexThreadHistoryTimeline({
2367
+ threadId,
2368
+ cwd: this.config.cwd ?? null,
2369
+ requestThread: (threadIdToRead) => {
2370
+ return readCodexThread(client, threadIdToRead);
2371
+ },
2372
+ });
2373
+ if (timeline.length > 0) {
2374
+ this.persistedHistory = timeline;
2375
+ this.historyPending = true;
2376
+ }
2377
+ }
2378
+ catch (error) {
2379
+ this.logger.warn({ error }, "Failed to load Codex thread history");
2380
+ }
2381
+ }
2382
+ async ensureThreadLoaded() {
2383
+ if (!this.client || !this.currentThreadId)
2384
+ return;
2385
+ try {
2386
+ const loaded = toObjectRecord(await this.client.request("thread/loaded/list", {}));
2387
+ const ids = Array.isArray(loaded?.data) ? loaded.data : [];
2388
+ if (ids.includes(this.currentThreadId)) {
2389
+ return;
2390
+ }
2391
+ const params = { threadId: this.currentThreadId };
2392
+ const developerInstructions = composeSystemPromptParts(this.config.systemPrompt, this.config.daemonAppendSystemPrompt);
2393
+ if (developerInstructions) {
2394
+ params.developerInstructions = developerInstructions;
2395
+ }
2396
+ const codexConfig = this.buildCodexInnerConfig();
2397
+ if (codexConfig) {
2398
+ params.config = codexConfig;
2399
+ }
2400
+ await this.client.request("thread/resume", params);
2401
+ }
2402
+ catch (error) {
2403
+ const threadId = this.currentThreadId;
2404
+ const message = error instanceof Error ? error.message : String(error);
2405
+ this.logger.warn({ error, threadId }, "Failed to resume persisted Codex thread");
2406
+ throw new Error(`Failed to resume Codex thread ${threadId}: ${message}`, { cause: error });
2407
+ }
2408
+ }
2409
+ parseSlashCommandInput(text) {
2410
+ const trimmed = text.trim();
2411
+ if (!trimmed.startsWith("/") || trimmed.length <= 1) {
2412
+ return null;
2413
+ }
2414
+ const withoutPrefix = trimmed.slice(1);
2415
+ const firstWhitespaceIdx = withoutPrefix.search(/\s/);
2416
+ const commandName = firstWhitespaceIdx === -1 ? withoutPrefix : withoutPrefix.slice(0, firstWhitespaceIdx);
2417
+ if (!commandName || commandName.includes("/")) {
2418
+ return null;
2419
+ }
2420
+ const rawArgs = firstWhitespaceIdx === -1 ? "" : withoutPrefix.slice(firstWhitespaceIdx + 1).trim();
2421
+ return rawArgs.length > 0 ? { commandName, args: rawArgs } : { commandName };
2422
+ }
2423
+ async resolveSlashCommandInvocation(prompt) {
2424
+ if (typeof prompt !== "string") {
2425
+ return null;
2426
+ }
2427
+ const parsed = this.parseSlashCommandInput(prompt);
2428
+ if (!parsed) {
2429
+ return null;
2430
+ }
2431
+ try {
2432
+ const commands = await this.listCommands();
2433
+ return commands.some((command) => command.name === parsed.commandName) ? parsed : null;
2434
+ }
2435
+ catch (error) {
2436
+ this.logger.warn({ err: error, commandName: parsed.commandName }, "Failed to resolve slash command; falling back to plain prompt input");
2437
+ return null;
2438
+ }
2439
+ }
2440
+ async buildCommandPromptInput(commandName, args) {
2441
+ if (commandName.startsWith("prompts:")) {
2442
+ const promptName = commandName.slice("prompts:".length);
2443
+ const codexHome = resolveCodexHomeDir();
2444
+ const promptPath = path.join(codexHome, "prompts", `${promptName}.md`);
2445
+ const raw = await fs.readFile(promptPath, "utf8");
2446
+ const parsed = parseFrontMatter(raw);
2447
+ return expandCodexCustomPrompt(parsed.body, args);
2448
+ }
2449
+ if (!this.connected) {
2450
+ await this.connect();
2451
+ }
2452
+ else {
2453
+ await this.loadSkills();
2454
+ }
2455
+ const skill = this.cachedSkills.find((entry) => entry.name === commandName);
2456
+ if (skill) {
2457
+ const trimmedArgs = args?.trim() ?? "";
2458
+ const text = trimmedArgs ? `$${skill.name} ${trimmedArgs}` : `$${skill.name}`;
2459
+ const input = [
2460
+ { type: "skill", name: skill.name, path: skill.path },
2461
+ { type: "text", text },
2462
+ ];
2463
+ return input;
2464
+ }
2465
+ return args ? `$${commandName} ${args}` : `$${commandName}`;
2466
+ }
2467
+ async buildTurnStartParams(prompt, options) {
2468
+ const input = await this.buildUserInput(prompt);
2469
+ const preset = MODE_PRESETS[this.currentMode] ?? MODE_PRESETS[DEFAULT_CODEX_MODE_ID];
2470
+ const approvalPolicy = this.config.approvalPolicy ?? preset.approvalPolicy;
2471
+ const sandboxPolicyType = this.config.sandboxMode ?? preset.sandbox;
2472
+ const params = {
2473
+ threadId: this.currentThreadId,
2474
+ input,
2475
+ approvalPolicy,
2476
+ sandboxPolicy: toSandboxPolicy(sandboxPolicyType, typeof this.config.networkAccess === "boolean"
2477
+ ? this.config.networkAccess
2478
+ : preset.networkAccess),
2479
+ };
2480
+ applyApprovalsReviewerParam(params, preset);
2481
+ if (this.config.model) {
2482
+ params.model = this.config.model;
2483
+ }
2484
+ const thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
2485
+ if (thinkingOptionId) {
2486
+ params.effort = thinkingOptionId;
2487
+ }
2488
+ if (this.serviceTier) {
2489
+ params.serviceTier = this.serviceTier;
2490
+ }
2491
+ if (this.resolvedCollaborationMode) {
2492
+ params.collaborationMode = {
2493
+ mode: this.resolvedCollaborationMode.mode,
2494
+ settings: this.resolvedCollaborationMode.settings,
2495
+ };
2496
+ }
2497
+ if (this.config.cwd) {
2498
+ params.cwd = this.config.cwd;
2499
+ }
2500
+ if (options?.outputSchema) {
2501
+ params.outputSchema = normalizeCodexOutputSchema(options.outputSchema);
2502
+ }
2503
+ const developerInstructions = composeSystemPromptParts(this.config.systemPrompt, this.config.daemonAppendSystemPrompt);
2504
+ if (developerInstructions) {
2505
+ params.developerInstructions = developerInstructions;
2506
+ }
2507
+ const codexConfig = this.buildCodexInnerConfig();
2508
+ if (codexConfig) {
2509
+ params.config = codexConfig;
2510
+ }
2511
+ return {
2512
+ params,
2513
+ thinkingOptionId,
2514
+ approvalPolicy,
2515
+ sandboxPolicyType,
2516
+ hasOutputSchema: Boolean(options?.outputSchema),
2517
+ hasDeveloperInstructions: Boolean(developerInstructions),
2518
+ hasCodexConfig: Boolean(codexConfig),
2519
+ };
2520
+ }
2521
+ logTurnStartSummary({ turnId, thinkingOptionId, approvalPolicy, sandboxPolicyType, hasOutputSchema, hasDeveloperInstructions, hasCodexConfig, }) {
2522
+ this.logger.info({
2523
+ turnId,
2524
+ threadId: this.currentThreadId,
2525
+ model: this.config.model ?? null,
2526
+ modeId: this.currentMode ?? null,
2527
+ effort: thinkingOptionId ?? null,
2528
+ serviceTier: this.serviceTier,
2529
+ cwd: this.config.cwd ?? null,
2530
+ approvalPolicy,
2531
+ sandboxPolicyType,
2532
+ hasCollaborationMode: Boolean(this.resolvedCollaborationMode),
2533
+ hasOutputSchema,
2534
+ hasDeveloperInstructions,
2535
+ hasCodexConfig,
2536
+ }, "Starting Codex app-server turn");
2537
+ }
2538
+ async run(prompt, options) {
2539
+ return runProviderTurn({
2540
+ prompt,
2541
+ runOptions: options,
2542
+ startTurn: (p, o) => this.startTurn(p, o),
2543
+ subscribe: (callback) => this.subscribe(callback),
2544
+ getSessionId: async () => (await this.getRuntimeInfo()).sessionId ?? "",
2545
+ reduceFinalText: ({ current, item }) => {
2546
+ if (item.type === "assistant_message") {
2547
+ return item.text;
2548
+ }
2549
+ if (item.type === "tool_call" && item.detail.type === "plan") {
2550
+ return item.detail.text;
2551
+ }
2552
+ return current;
2553
+ },
2554
+ });
2555
+ }
2556
+ async startTurn(prompt, options) {
2557
+ if (this.activeForegroundTurnId) {
2558
+ throw new Error("A foreground turn is already active");
2559
+ }
2560
+ await this.connect();
2561
+ if (!this.client) {
2562
+ throw new Error("Codex client not initialized");
2563
+ }
2564
+ const slashCommand = await this.resolveSlashCommandInvocation(prompt);
2565
+ const effectivePrompt = slashCommand
2566
+ ? await this.buildCommandPromptInput(slashCommand.commandName, slashCommand.args)
2567
+ : prompt;
2568
+ if (this.currentThreadId) {
2569
+ await this.ensureThreadLoaded();
2570
+ }
2571
+ else {
2572
+ await this.ensureThread();
2573
+ }
2574
+ const turnStart = await this.buildTurnStartParams(effectivePrompt, options);
2575
+ const turnId = this.createTurnId();
2576
+ this.activeForegroundTurnId = turnId;
2577
+ try {
2578
+ this.logTurnStartSummary({
2579
+ turnId,
2580
+ thinkingOptionId: turnStart.thinkingOptionId,
2581
+ approvalPolicy: turnStart.approvalPolicy,
2582
+ sandboxPolicyType: turnStart.sandboxPolicyType,
2583
+ hasOutputSchema: turnStart.hasOutputSchema,
2584
+ hasDeveloperInstructions: turnStart.hasDeveloperInstructions,
2585
+ hasCodexConfig: turnStart.hasCodexConfig,
2586
+ });
2587
+ await this.client.request("turn/start", turnStart.params, TURN_START_TIMEOUT_MS);
2588
+ }
2589
+ catch (error) {
2590
+ this.activeForegroundTurnId = null;
2591
+ throw error;
2592
+ }
2593
+ return { turnId };
2594
+ }
2595
+ subscribe(callback) {
2596
+ this.subscribers.add(callback);
2597
+ return () => {
2598
+ this.subscribers.delete(callback);
2599
+ };
2600
+ }
2601
+ async *streamHistory() {
2602
+ if (!this.historyPending || this.persistedHistory.length === 0) {
2603
+ return;
2604
+ }
2605
+ const history = this.persistedHistory;
2606
+ this.persistedHistory = [];
2607
+ this.historyPending = false;
2608
+ for (const entry of history) {
2609
+ yield {
2610
+ type: "timeline",
2611
+ provider: CODEX_PROVIDER,
2612
+ item: entry.item,
2613
+ timestamp: entry.timestamp,
2614
+ };
2615
+ }
2616
+ }
2617
+ async getRuntimeInfo() {
2618
+ if (this.cachedRuntimeInfo)
2619
+ return { ...this.cachedRuntimeInfo };
2620
+ if (!this.connected) {
2621
+ await this.connect();
2622
+ }
2623
+ if (!this.currentThreadId) {
2624
+ await this.ensureThread();
2625
+ }
2626
+ const info = {
2627
+ provider: CODEX_PROVIDER,
2628
+ sessionId: this.currentThreadId,
2629
+ model: this.config.model ?? null,
2630
+ thinkingOptionId: normalizeCodexThinkingOptionId(this.config.thinkingOptionId) ?? null,
2631
+ modeId: this.currentMode ?? null,
2632
+ extra: this.resolvedCollaborationMode
2633
+ ? { collaborationMode: this.resolvedCollaborationMode.name }
2634
+ : undefined,
2635
+ };
2636
+ this.cachedRuntimeInfo = info;
2637
+ return { ...info };
2638
+ }
2639
+ async getAvailableModes() {
2640
+ if (this.autoReviewEnabled) {
2641
+ return CODEX_MODES;
2642
+ }
2643
+ return CODEX_MODES.filter((mode) => mode.id !== "auto-review");
2644
+ }
2645
+ async getCurrentMode() {
2646
+ return this.currentMode ?? null;
2647
+ }
2648
+ async setMode(modeId) {
2649
+ validateCodexMode(modeId);
2650
+ this.currentMode = modeId;
2651
+ this.cachedRuntimeInfo = null;
2652
+ }
2653
+ async setModel(modelId) {
2654
+ this.config.model = modelId ?? undefined;
2655
+ if (!codexModelSupportsFastMode(this.config.model)) {
2656
+ this.serviceTier = null;
2657
+ }
2658
+ this.refreshResolvedCollaborationMode();
2659
+ this.cachedRuntimeInfo = null;
2660
+ }
2661
+ async setThinkingOption(thinkingOptionId) {
2662
+ this.config.thinkingOptionId = normalizeCodexThinkingOptionId(thinkingOptionId);
2663
+ this.refreshResolvedCollaborationMode();
2664
+ this.cachedRuntimeInfo = null;
2665
+ }
2666
+ async setFeature(featureId, value) {
2667
+ if (featureId === "fast_mode") {
2668
+ if (Boolean(value) && !codexModelSupportsFastMode(this.config.model)) {
2669
+ throw new Error(`Codex fast mode is not available for model '${this.config.model ?? "default"}'`);
2670
+ }
2671
+ this.applyFeatureValue("fast_mode", Boolean(value));
2672
+ return;
2673
+ }
2674
+ if (featureId === "plan_mode") {
2675
+ this.applyFeatureValue("plan_mode", Boolean(value));
2676
+ return;
2677
+ }
2678
+ throw new Error(`Unknown Codex feature: ${featureId}`);
2679
+ }
2680
+ getPendingPermissions() {
2681
+ return Array.from(this.pendingPermissions.values());
2682
+ }
2683
+ async respondToPermission(requestId, response) {
2684
+ const pending = this.pendingPermissionHandlers.get(requestId);
2685
+ if (!pending) {
2686
+ throw new Error(`No pending Codex app-server permission request with id '${requestId}'`);
2687
+ }
2688
+ const pendingRequest = this.pendingPermissions.get(requestId) ?? null;
2689
+ if (pending.kind === "plan") {
2690
+ return this.handlePlanPermissionResponse({ requestId, response, pending, pendingRequest });
2691
+ }
2692
+ this.pendingPermissionHandlers.delete(requestId);
2693
+ this.pendingPermissions.delete(requestId);
2694
+ this.resolvedPermissionRequests.add(requestId);
2695
+ if (response.behavior === "deny" && pendingRequest?.kind === "tool") {
2696
+ this.emitDeniedToolCallTimelineEvent({ requestId, response, pendingRequest });
2697
+ }
2698
+ this.emitEvent({
2699
+ type: "permission_resolved",
2700
+ provider: CODEX_PROVIDER,
2701
+ requestId,
2702
+ resolution: response,
2703
+ });
2704
+ if (pending.kind === "command") {
2705
+ pending.resolve({ decision: resolvePermissionDecision(response) });
2706
+ return;
2707
+ }
2708
+ if (pending.kind === "file") {
2709
+ pending.resolve({ decision: resolvePermissionDecision(response) });
2710
+ return;
2711
+ }
2712
+ const questions = pending.questions ?? [];
2713
+ const itemId = typeof pendingRequest?.metadata?.itemId === "string"
2714
+ ? pendingRequest.metadata.itemId
2715
+ : requestId;
2716
+ if (response.behavior === "allow") {
2717
+ const mappedAnswers = mapCodexQuestionResponseByHeader({
2718
+ questions,
2719
+ response,
2720
+ });
2721
+ const answers = mappedAnswers ??
2722
+ Object.fromEntries(questions
2723
+ .map((question) => {
2724
+ const fallback = question.options[0]?.label?.trim();
2725
+ return fallback ? [question.id, { answers: [fallback] }] : null;
2726
+ })
2727
+ .filter((entry) => entry !== null));
2728
+ this.emitEvent({
2729
+ type: "timeline",
2730
+ provider: CODEX_PROVIDER,
2731
+ item: mapCodexQuestionRequestToToolCall({
2732
+ callId: itemId,
2733
+ questions,
2734
+ status: "completed",
2735
+ answers: Object.fromEntries(Object.entries(answers).map(([id, value]) => [id, value.answers])),
2736
+ }),
2737
+ });
2738
+ pending.resolve({ answers });
2739
+ return;
2740
+ }
2741
+ this.emitEvent({
2742
+ type: "timeline",
2743
+ provider: CODEX_PROVIDER,
2744
+ item: mapCodexQuestionRequestToToolCall({
2745
+ callId: itemId,
2746
+ questions,
2747
+ status: response.interrupt ? "canceled" : "failed",
2748
+ error: { message: response.message ?? "Question dismissed" },
2749
+ }),
2750
+ });
2751
+ pending.resolve({ answers: {} });
2752
+ }
2753
+ handlePlanPermissionResponse(params) {
2754
+ const { requestId, response, pending, pendingRequest } = params;
2755
+ let followUpPrompt;
2756
+ if (response.behavior === "allow") {
2757
+ followUpPrompt = this.preparePlanImplementation({
2758
+ planText: pending.planText ?? pendingRequest?.metadata?.planText,
2759
+ });
2760
+ }
2761
+ this.pendingPermissionHandlers.delete(requestId);
2762
+ this.pendingPermissions.delete(requestId);
2763
+ this.resolvedPermissionRequests.add(requestId);
2764
+ this.emitEvent({
2765
+ type: "permission_resolved",
2766
+ provider: CODEX_PROVIDER,
2767
+ requestId,
2768
+ resolution: response,
2769
+ });
2770
+ if (followUpPrompt) {
2771
+ return { followUpPrompt };
2772
+ }
2773
+ }
2774
+ emitDeniedToolCallTimelineEvent(params) {
2775
+ const { requestId, response, pendingRequest } = params;
2776
+ let fallbackName;
2777
+ if (pendingRequest.name === "CodexBash") {
2778
+ fallbackName = "shell";
2779
+ }
2780
+ else if (pendingRequest.name === "CodexFileChange") {
2781
+ fallbackName = "apply_patch";
2782
+ }
2783
+ else {
2784
+ fallbackName = pendingRequest.name;
2785
+ }
2786
+ this.emitEvent({
2787
+ type: "timeline",
2788
+ provider: CODEX_PROVIDER,
2789
+ item: {
2790
+ type: "tool_call",
2791
+ callId: requestId,
2792
+ name: fallbackName,
2793
+ status: "failed",
2794
+ error: { message: response.message ?? "Permission denied" },
2795
+ detail: pendingRequest.detail ?? {
2796
+ type: "unknown",
2797
+ input: pendingRequest.input ?? null,
2798
+ output: null,
2799
+ },
2800
+ metadata: {
2801
+ permissionRequestId: requestId,
2802
+ denied: true,
2803
+ },
2804
+ },
2805
+ });
2806
+ }
2807
+ describePersistence() {
2808
+ if (!this.currentThreadId)
2809
+ return null;
2810
+ const thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId) ?? null;
2811
+ return {
2812
+ provider: CODEX_PROVIDER,
2813
+ sessionId: this.currentThreadId,
2814
+ nativeHandle: this.currentThreadId,
2815
+ metadata: {
2816
+ provider: CODEX_PROVIDER,
2817
+ cwd: this.config.cwd,
2818
+ title: this.config.title ?? null,
2819
+ threadId: this.currentThreadId,
2820
+ modeId: this.currentMode,
2821
+ model: this.config.model ?? null,
2822
+ thinkingOptionId,
2823
+ extra: this.config.extra,
2824
+ systemPrompt: this.config.systemPrompt,
2825
+ mcpServers: this.config.mcpServers,
2826
+ },
2827
+ };
2828
+ }
2829
+ async interrupt() {
2830
+ if (!this.client || !this.currentThreadId || !this.currentTurnId)
2831
+ return;
2832
+ try {
2833
+ await this.client.request("turn/interrupt", {
2834
+ threadId: this.currentThreadId,
2835
+ turnId: this.currentTurnId,
2836
+ }, INTERRUPT_TIMEOUT_MS);
2837
+ }
2838
+ catch (error) {
2839
+ this.logger.warn({ error }, "Failed to interrupt Codex turn");
2840
+ }
2841
+ }
2842
+ async close() {
2843
+ for (const pending of this.pendingPermissionHandlers.values()) {
2844
+ pending.resolve({ decision: "cancel" });
2845
+ }
2846
+ this.pendingPermissionHandlers.clear();
2847
+ this.pendingPermissions.clear();
2848
+ this.resolvedPermissionRequests.clear();
2849
+ this.subscribers.clear();
2850
+ this.activeForegroundTurnId = null;
2851
+ if (this.client) {
2852
+ await this.client.dispose();
2853
+ }
2854
+ this.client = null;
2855
+ this.connected = false;
2856
+ this.currentThreadId = null;
2857
+ this.currentTurnId = null;
2858
+ }
2859
+ async listCommands() {
2860
+ const prompts = await listCodexCustomPrompts();
2861
+ if (!this.connected) {
2862
+ await this.connect();
2863
+ }
2864
+ else {
2865
+ await this.loadSkills();
2866
+ }
2867
+ const appServerSkills = this.cachedSkills.map((skill) => ({
2868
+ name: skill.name,
2869
+ description: skill.description,
2870
+ argumentHint: "",
2871
+ }));
2872
+ const fallbackSkills = appServerSkills.length === 0
2873
+ ? await listCodexSkills(this.config.cwd, this.deps.workspaceGitService)
2874
+ : [];
2875
+ const builtin = [
2876
+ {
2877
+ name: "compact",
2878
+ description: "Summarize conversation to prevent hitting the context limit",
2879
+ argumentHint: "",
2880
+ },
2881
+ ];
2882
+ if (this.goalsEnabled) {
2883
+ builtin.push({
2884
+ name: "goal",
2885
+ description: "Set, pause, resume, or clear the agent's goal",
2886
+ argumentHint: "[<objective>|pause|resume|clear]",
2887
+ });
2888
+ }
2889
+ return [...builtin, ...appServerSkills, ...fallbackSkills, ...prompts].sort((a, b) => a.name.localeCompare(b.name));
2890
+ }
2891
+ tryHandleOutOfBand(prompt) {
2892
+ if (typeof prompt !== "string")
2893
+ return null;
2894
+ const parsed = this.parseSlashCommandInput(prompt);
2895
+ if (!parsed)
2896
+ return null;
2897
+ if (parsed.commandName === "compact") {
2898
+ return {
2899
+ run: async ({ emit }) => {
2900
+ const error = await this.executeCompactCommand();
2901
+ if (error) {
2902
+ emit({
2903
+ type: "timeline",
2904
+ provider: CODEX_PROVIDER,
2905
+ item: { type: "assistant_message", text: formatOutOfBandStatusMessage(error) },
2906
+ });
2907
+ }
2908
+ },
2909
+ };
2910
+ }
2911
+ if (!this.goalsEnabled || parsed.commandName !== "goal")
2912
+ return null;
2913
+ const subcommand = parseGoalSubcommand(parsed.args);
2914
+ return {
2915
+ run: async ({ emit }) => {
2916
+ const text = formatOutOfBandStatusMessage(await this.executeGoalSubcommand(subcommand));
2917
+ emit({
2918
+ type: "timeline",
2919
+ provider: CODEX_PROVIDER,
2920
+ item: { type: "assistant_message", text },
2921
+ });
2922
+ },
2923
+ };
2924
+ }
2925
+ async executeCompactCommand() {
2926
+ try {
2927
+ await this.connect();
2928
+ if (this.currentThreadId) {
2929
+ await this.ensureThreadLoaded();
2930
+ }
2931
+ else {
2932
+ await this.ensureThread();
2933
+ }
2934
+ if (!this.client || !this.currentThreadId) {
2935
+ throw new Error("Codex thread is not available");
2936
+ }
2937
+ this.pendingManualCompactionStarts += 1;
2938
+ try {
2939
+ await this.client.request("thread/compact/start", {
2940
+ threadId: this.currentThreadId,
2941
+ });
2942
+ }
2943
+ catch (error) {
2944
+ this.pendingManualCompactionStarts = Math.max(0, this.pendingManualCompactionStarts - 1);
2945
+ throw error;
2946
+ }
2947
+ return null;
2948
+ }
2949
+ catch (error) {
2950
+ const message = error instanceof Error ? error.message : "unknown error";
2951
+ return `Failed to compact context: ${message}`;
2952
+ }
2953
+ }
2954
+ async executeGoalSubcommand(subcommand) {
2955
+ if (subcommand.kind === "usage") {
2956
+ return "Usage: /goal <objective>|pause|resume|clear";
2957
+ }
2958
+ try {
2959
+ await this.connect();
2960
+ if (this.currentThreadId) {
2961
+ await this.ensureThreadLoaded();
2962
+ }
2963
+ else {
2964
+ await this.ensureThread();
2965
+ }
2966
+ if (!this.client || !this.currentThreadId) {
2967
+ throw new Error("Codex thread is not available");
2968
+ }
2969
+ switch (subcommand.kind) {
2970
+ case "set": {
2971
+ await this.client.request("thread/goal/set", {
2972
+ threadId: this.currentThreadId,
2973
+ objective: subcommand.objective,
2974
+ status: "active",
2975
+ });
2976
+ return `Goal set: ${subcommand.objective}`;
2977
+ }
2978
+ case "pause": {
2979
+ await this.client.request("thread/goal/set", {
2980
+ threadId: this.currentThreadId,
2981
+ status: "paused",
2982
+ });
2983
+ return "Goal paused.";
2984
+ }
2985
+ case "resume": {
2986
+ await this.client.request("thread/goal/set", {
2987
+ threadId: this.currentThreadId,
2988
+ status: "active",
2989
+ });
2990
+ return "Goal resumed.";
2991
+ }
2992
+ case "clear": {
2993
+ await this.client.request("thread/goal/clear", {
2994
+ threadId: this.currentThreadId,
2995
+ });
2996
+ return "Goal cleared.";
2997
+ }
2998
+ }
2999
+ }
3000
+ catch (error) {
3001
+ const message = error instanceof Error ? error.message : "unknown error";
3002
+ return `Failed to update goal: ${message}`;
3003
+ }
3004
+ }
3005
+ async resolveModelAndThinking() {
3006
+ if (!this.client) {
3007
+ throw new Error("Codex client is not initialized");
3008
+ }
3009
+ let configuredDefaults = {};
3010
+ let model = this.config.model;
3011
+ let thinkingOptionId = normalizeCodexThinkingOptionId(this.config.thinkingOptionId);
3012
+ if (!model || !thinkingOptionId) {
3013
+ configuredDefaults = await readCodexConfiguredDefaults(this.client, this.logger);
3014
+ }
3015
+ if (!model) {
3016
+ model = configuredDefaults.model;
3017
+ }
3018
+ if (!thinkingOptionId) {
3019
+ thinkingOptionId = configuredDefaults.thinkingOptionId;
3020
+ }
3021
+ if (!model || !thinkingOptionId) {
3022
+ const modelResponse = toObjectRecord(await this.client.request("model/list", {}));
3023
+ const modelData = Array.isArray(modelResponse?.data) ? modelResponse.data : [];
3024
+ const models = modelData
3025
+ .map((m) => {
3026
+ const record = toObjectRecord(m);
3027
+ return {
3028
+ id: typeof record?.id === "string" ? record.id : "",
3029
+ isDefault: !!record?.isDefault,
3030
+ defaultReasoningEffort: typeof record?.defaultReasoningEffort === "string"
3031
+ ? record.defaultReasoningEffort
3032
+ : undefined,
3033
+ };
3034
+ })
3035
+ .filter((m) => m.id);
3036
+ const defaultModel = models.find((m) => m.isDefault) ?? models[0];
3037
+ if (!defaultModel) {
3038
+ throw new Error("No models available from Codex app-server");
3039
+ }
3040
+ const selectedModel = (model ? models.find((candidate) => candidate.id === model) : undefined) ?? defaultModel;
3041
+ if (!model) {
3042
+ model = selectedModel.id;
3043
+ }
3044
+ if (!thinkingOptionId) {
3045
+ thinkingOptionId = normalizeCodexThinkingOptionId(selectedModel.defaultReasoningEffort);
3046
+ }
3047
+ }
3048
+ if (!model) {
3049
+ throw new Error("Unable to resolve Codex model");
3050
+ }
3051
+ return { model, thinkingOptionId };
3052
+ }
3053
+ async ensureThread() {
3054
+ if (!this.client)
3055
+ return;
3056
+ if (this.currentThreadId)
3057
+ return;
3058
+ const { model, thinkingOptionId } = await this.resolveModelAndThinking();
3059
+ this.config.model = model;
3060
+ this.config.thinkingOptionId = thinkingOptionId;
3061
+ const preset = MODE_PRESETS[this.currentMode] ?? MODE_PRESETS[DEFAULT_CODEX_MODE_ID];
3062
+ const approvalPolicy = this.config.approvalPolicy ?? preset.approvalPolicy;
3063
+ const sandbox = this.config.sandboxMode ?? preset.sandbox;
3064
+ const innerConfig = this.buildCodexInnerConfig();
3065
+ const developerInstructions = composeSystemPromptParts(this.config.systemPrompt, this.config.daemonAppendSystemPrompt);
3066
+ const params = {
3067
+ model,
3068
+ cwd: this.config.cwd ?? null,
3069
+ approvalPolicy,
3070
+ sandbox,
3071
+ ...(developerInstructions ? { developerInstructions } : {}),
3072
+ ...(innerConfig ? { config: innerConfig } : {}),
3073
+ ...(this.ephemeral ? { ephemeral: true } : {}),
3074
+ };
3075
+ applyApprovalsReviewerParam(params, preset);
3076
+ const rawResponse = await this.client.request("thread/start", params);
3077
+ const response = toObjectRecord(rawResponse);
3078
+ const threadRecord = toObjectRecord(response?.thread);
3079
+ const threadId = typeof threadRecord?.id === "string" ? threadRecord.id : undefined;
3080
+ if (!threadId) {
3081
+ throw new Error("Codex app-server did not return thread id");
3082
+ }
3083
+ const responseApprovalsReviewer = typeof response?.approvalsReviewer === "string" ? response.approvalsReviewer : undefined;
3084
+ if (shouldPromoteThreadResponseToAutoReview({
3085
+ approvalsReviewer: responseApprovalsReviewer,
3086
+ approvalPolicy,
3087
+ sandbox,
3088
+ })) {
3089
+ this.currentMode = "auto-review";
3090
+ this.cachedRuntimeInfo = null;
3091
+ }
3092
+ this.currentThreadId = threadId;
3093
+ }
3094
+ buildCodexInnerConfig() {
3095
+ const innerConfig = {};
3096
+ if (this.config.mcpServers) {
3097
+ const mcpServers = {};
3098
+ for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
3099
+ mcpServers[name] = toCodexMcpConfig(serverConfig);
3100
+ }
3101
+ innerConfig.mcp_servers = mcpServers;
3102
+ }
3103
+ if (this.config.extra?.codex) {
3104
+ Object.assign(innerConfig, this.config.extra.codex);
3105
+ }
3106
+ if (this.deps.customCodexConfig) {
3107
+ Object.assign(innerConfig, this.deps.customCodexConfig);
3108
+ }
3109
+ return Object.keys(innerConfig).length > 0 ? innerConfig : null;
3110
+ }
3111
+ async buildUserInput(prompt) {
3112
+ if (typeof prompt === "string") {
3113
+ return [toCodexTextInput(prompt)];
3114
+ }
3115
+ return await codexAppServerTurnInputFromPrompt(prompt, this.logger);
3116
+ }
3117
+ emitEvent(event) {
3118
+ this.notifySubscribers(event);
3119
+ }
3120
+ notifySubscribers(event) {
3121
+ const turnId = this.activeForegroundTurnId;
3122
+ const tagged = turnId ? { ...event, turnId } : event;
3123
+ this.logger.trace({
3124
+ agentId: this.agentId,
3125
+ provider: CODEX_PROVIDER,
3126
+ sessionId: this.currentThreadId,
3127
+ turnId: getAgentStreamEventTurnId(tagged),
3128
+ event: tagged,
3129
+ }, "provider.codex.event_emit");
3130
+ for (const callback of this.subscribers) {
3131
+ try {
3132
+ callback(tagged);
3133
+ }
3134
+ catch (error) {
3135
+ this.logger.warn({ err: error }, "Subscriber callback threw");
3136
+ }
3137
+ }
3138
+ }
3139
+ createTurnId() {
3140
+ return `codex-turn-${this.nextTurnOrdinal++}`;
3141
+ }
3142
+ handleNotification(method, params) {
3143
+ const parsed = CodexNotificationSchema.parse({ method, params });
3144
+ this.traceParsedNotification(method, params, parsed);
3145
+ switch (parsed.kind) {
3146
+ case "thread_started":
3147
+ this.handleThreadStartedNotification(parsed);
3148
+ return;
3149
+ case "turn_started":
3150
+ this.handleTurnStartedNotification(parsed);
3151
+ return;
3152
+ case "turn_completed":
3153
+ this.handleTurnCompletedNotification(parsed);
3154
+ return;
3155
+ case "plan_updated":
3156
+ this.handlePlanUpdatedNotification(parsed);
3157
+ return;
3158
+ case "diff_updated":
3159
+ // NOTE: Codex app-server emits frequent `turn/diff/updated` notifications
3160
+ // containing a full accumulated unified diff for the *entire turn*.
3161
+ // This is not a concrete file-change tool call; it is progress telemetry.
3162
+ return;
3163
+ case "token_usage_updated":
3164
+ this.handleTokenUsageUpdatedNotification(parsed);
3165
+ return;
3166
+ case "context_compacted":
3167
+ this.handleContextCompactedNotification(parsed);
3168
+ return;
3169
+ case "agent_message_delta":
3170
+ case "reasoning_delta":
3171
+ case "exec_command_output_delta":
3172
+ case "file_change_output_delta":
3173
+ this.handleCodexDeltaNotification(parsed);
3174
+ return;
3175
+ case "exec_command_started":
3176
+ this.handleExecCommandStartedNotification(parsed);
3177
+ return;
3178
+ case "exec_command_completed":
3179
+ this.handleExecCommandCompletedNotification(parsed);
3180
+ return;
3181
+ case "terminal_interaction":
3182
+ this.handleTerminalInteractionNotification(parsed);
3183
+ return;
3184
+ case "patch_apply_started":
3185
+ this.handlePatchApplyStartedNotification(parsed);
3186
+ return;
3187
+ case "patch_apply_completed":
3188
+ this.handlePatchApplyCompletedNotification(parsed);
3189
+ return;
3190
+ case "item_completed":
3191
+ this.handleItemCompletedNotification(parsed);
3192
+ return;
3193
+ case "item_started":
3194
+ this.handleItemStartedNotification(parsed);
3195
+ return;
3196
+ case "invalid_payload":
3197
+ this.warnInvalidNotificationPayload(parsed.method, parsed.params);
3198
+ return;
3199
+ default:
3200
+ this.warnUnknownNotificationMethod(parsed.method, parsed.params);
3201
+ }
3202
+ }
3203
+ traceParsedNotification(method, params, parsed) {
3204
+ this.logger.trace({
3205
+ agentId: this.agentId,
3206
+ provider: CODEX_PROVIDER,
3207
+ sessionId: this.currentThreadId,
3208
+ turnId: this.activeForegroundTurnId ?? undefined,
3209
+ method,
3210
+ params,
3211
+ parsed,
3212
+ }, "provider.codex.parsed_event");
3213
+ }
3214
+ getSubAgentCallIdForThread(threadId) {
3215
+ if (!threadId || threadId === this.currentThreadId) {
3216
+ return null;
3217
+ }
3218
+ return this.subAgentCallIdByChildThreadId.get(threadId) ?? null;
3219
+ }
3220
+ registerSubAgentToolCall(timelineItem, rawItem) {
3221
+ if (timelineItem.detail.type !== "sub_agent") {
3222
+ return;
3223
+ }
3224
+ const existing = this.subAgentCallsByCallId.get(timelineItem.callId);
3225
+ const state = existing ??
3226
+ {
3227
+ callId: timelineItem.callId,
3228
+ toolCall: timelineItem,
3229
+ childItemOrder: [],
3230
+ childItems: new Map(),
3231
+ };
3232
+ state.toolCall = {
3233
+ ...timelineItem,
3234
+ detail: {
3235
+ ...timelineItem.detail,
3236
+ log: timelineItem.detail.log ||
3237
+ (state.toolCall.detail.type === "sub_agent" ? state.toolCall.detail.log : ""),
3238
+ },
3239
+ };
3240
+ this.subAgentCallsByCallId.set(timelineItem.callId, state);
3241
+ const receiverThreadIds = Array.isArray(rawItem.receiverThreadIds)
3242
+ ? rawItem.receiverThreadIds.filter((value) => typeof value === "string")
3243
+ : [];
3244
+ for (const receiverThreadId of receiverThreadIds) {
3245
+ this.subAgentCallIdByChildThreadId.set(receiverThreadId, timelineItem.callId);
3246
+ }
3247
+ }
3248
+ upsertSubAgentChildItem(callId, itemId, item) {
3249
+ const state = this.subAgentCallsByCallId.get(callId);
3250
+ if (!state) {
3251
+ return;
3252
+ }
3253
+ if (!state.childItems.has(itemId)) {
3254
+ state.childItemOrder.push(itemId);
3255
+ }
3256
+ state.childItems.set(itemId, item);
3257
+ }
3258
+ getSubAgentChildTimeline(state) {
3259
+ return state.childItemOrder
3260
+ .map((itemId) => state.childItems.get(itemId))
3261
+ .filter((item) => Boolean(item));
3262
+ }
3263
+ emitSubAgentActivityUpdate(callId, status) {
3264
+ const state = this.subAgentCallsByCallId.get(callId);
3265
+ if (!state || state.toolCall.detail.type !== "sub_agent") {
3266
+ return;
3267
+ }
3268
+ const childTimeline = this.getSubAgentChildTimeline(state);
3269
+ const log = childTimeline.length > 0
3270
+ ? curateAgentActivity(childTimeline, { labelAssistantMessages: true })
3271
+ : "";
3272
+ const resolvedStatus = status ?? state.toolCall.status;
3273
+ const baseToolCall = {
3274
+ ...state.toolCall,
3275
+ detail: {
3276
+ ...state.toolCall.detail,
3277
+ log,
3278
+ },
3279
+ };
3280
+ const nextToolCall = resolvedStatus === "failed"
3281
+ ? {
3282
+ ...baseToolCall,
3283
+ status: "failed",
3284
+ error: state.toolCall.error ?? { message: "Sub-agent failed" },
3285
+ }
3286
+ : {
3287
+ ...baseToolCall,
3288
+ status: resolvedStatus,
3289
+ error: null,
3290
+ };
3291
+ state.toolCall = nextToolCall;
3292
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: nextToolCall });
3293
+ }
3294
+ handleSubAgentChildItemCompleted(callId, itemId, timelineItem) {
3295
+ this.applyBufferedDeltaTextToTimelineItem(timelineItem, itemId);
3296
+ if (itemId) {
3297
+ this.upsertSubAgentChildItem(callId, itemId, timelineItem);
3298
+ this.pendingAgentMessages.delete(itemId);
3299
+ this.pendingReasoning.delete(itemId);
3300
+ this.pendingCommandOutputDeltas.delete(itemId);
3301
+ this.pendingFileChangeOutputDeltas.delete(itemId);
3302
+ }
3303
+ this.emitSubAgentActivityUpdate(callId, "running");
3304
+ }
3305
+ shouldSkipCompletedThreadItem(timelineItem, normalizedItemType, itemId) {
3306
+ // For commandExecution items, codex/event/exec_command_* is authoritative.
3307
+ if (timelineItem.type === "tool_call" && normalizedItemType === "commandExecution") {
3308
+ const callId = timelineItem.callId || itemId;
3309
+ return Boolean(callId && this.emittedExecCommandCompletedCallIds.has(callId));
3310
+ }
3311
+ return Boolean(itemId && this.emittedItemCompletedIds.has(itemId));
3312
+ }
3313
+ handleCodexDeltaNotification(parsed) {
3314
+ if (parsed.kind === "agent_message_delta") {
3315
+ const prev = this.pendingAgentMessages.get(parsed.itemId) ?? "";
3316
+ const text = prev + parsed.delta;
3317
+ this.pendingAgentMessages.set(parsed.itemId, text);
3318
+ const subAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3319
+ if (subAgentCallId) {
3320
+ this.upsertSubAgentChildItem(subAgentCallId, parsed.itemId, {
3321
+ type: "assistant_message",
3322
+ messageId: parsed.itemId,
3323
+ text,
3324
+ });
3325
+ this.emitSubAgentActivityUpdate(subAgentCallId, "running");
3326
+ return;
3327
+ }
3328
+ const isFirstDeltaForItem = prev.length === 0;
3329
+ this.emitEvent({
3330
+ type: "timeline",
3331
+ provider: CODEX_PROVIDER,
3332
+ item: {
3333
+ type: "assistant_message",
3334
+ messageId: parsed.itemId,
3335
+ text: isFirstDeltaForItem && this.pendingAssistantMessageBoundary
3336
+ ? `${ASSISTANT_MESSAGE_BOUNDARY_MARKDOWN}${parsed.delta}`
3337
+ : parsed.delta,
3338
+ },
3339
+ });
3340
+ if (isFirstDeltaForItem) {
3341
+ this.pendingAssistantMessageBoundary = false;
3342
+ }
3343
+ return;
3344
+ }
3345
+ if (parsed.kind === "reasoning_delta") {
3346
+ const prev = this.pendingReasoning.get(parsed.itemId) ?? [];
3347
+ prev.push(parsed.delta);
3348
+ this.pendingReasoning.set(parsed.itemId, prev);
3349
+ const subAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3350
+ if (subAgentCallId) {
3351
+ this.upsertSubAgentChildItem(subAgentCallId, parsed.itemId, {
3352
+ type: "reasoning",
3353
+ text: prev.join(""),
3354
+ });
3355
+ this.emitSubAgentActivityUpdate(subAgentCallId, "running");
3356
+ return;
3357
+ }
3358
+ this.emitEvent({
3359
+ type: "timeline",
3360
+ provider: CODEX_PROVIDER,
3361
+ item: { type: "reasoning", text: parsed.delta },
3362
+ });
3363
+ return;
3364
+ }
3365
+ if (parsed.kind === "exec_command_output_delta") {
3366
+ this.appendOutputDeltaChunk(this.pendingCommandOutputDeltas, parsed.callId, parsed.chunk, {
3367
+ decodeBase64: true,
3368
+ });
3369
+ return;
3370
+ }
3371
+ this.appendOutputDeltaChunk(this.pendingFileChangeOutputDeltas, parsed.itemId, parsed.delta);
3372
+ }
3373
+ handleThreadStartedNotification(parsed) {
3374
+ this.currentThreadId = parsed.threadId;
3375
+ this.emitEvent({
3376
+ type: "thread_started",
3377
+ provider: CODEX_PROVIDER,
3378
+ sessionId: parsed.threadId,
3379
+ });
3380
+ }
3381
+ handleTurnStartedNotification(parsed) {
3382
+ const subAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3383
+ if (subAgentCallId) {
3384
+ this.emitSubAgentActivityUpdate(subAgentCallId, "running");
3385
+ return;
3386
+ }
3387
+ this.currentTurnId = parsed.turnId;
3388
+ this.resetTurnTrackingState();
3389
+ this.emitEvent({ type: "turn_started", provider: CODEX_PROVIDER });
3390
+ }
3391
+ handleTurnCompletedNotification(parsed) {
3392
+ const subAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3393
+ if (subAgentCallId) {
3394
+ let status = "completed";
3395
+ if (parsed.status === "failed") {
3396
+ status = "failed";
3397
+ }
3398
+ else if (parsed.status === "interrupted") {
3399
+ status = "canceled";
3400
+ }
3401
+ this.emitSubAgentActivityUpdate(subAgentCallId, status);
3402
+ return;
3403
+ }
3404
+ if (parsed.status === "failed") {
3405
+ this.emitEvent({
3406
+ type: "turn_failed",
3407
+ provider: CODEX_PROVIDER,
3408
+ error: parsed.errorMessage ?? "Codex turn failed",
3409
+ });
3410
+ }
3411
+ else if (parsed.status === "interrupted") {
3412
+ this.emitEvent({ type: "turn_canceled", provider: CODEX_PROVIDER, reason: "interrupted" });
3413
+ }
3414
+ else {
3415
+ if (this.planModeEnabled && this.latestPlanResult?.text) {
3416
+ this.emitSyntheticPlanApprovalRequest(this.latestPlanResult.text);
3417
+ }
3418
+ this.emitEvent({
3419
+ type: "turn_completed",
3420
+ provider: CODEX_PROVIDER,
3421
+ usage: this.latestUsage,
3422
+ });
3423
+ }
3424
+ this.activeForegroundTurnId = null;
3425
+ this.resetTurnTrackingState();
3426
+ }
3427
+ resetTurnTrackingState() {
3428
+ this.latestPlanResult = null;
3429
+ this.emittedItemStartedIds.clear();
3430
+ this.emittedItemCompletedIds.clear();
3431
+ this.emittedExecCommandStartedCallIds.clear();
3432
+ this.emittedExecCommandCompletedCallIds.clear();
3433
+ this.pendingAgentMessages.clear();
3434
+ this.pendingReasoning.clear();
3435
+ this.pendingCommandOutputDeltas.clear();
3436
+ this.pendingFileChangeOutputDeltas.clear();
3437
+ this.pendingAssistantMessageBoundary = false;
3438
+ this.warnedIncompleteEditToolCallIds.clear();
3439
+ this.unpairedCompactionNotificationCompletions = 0;
3440
+ this.unpairedCompactionItemCompletions = 0;
3441
+ }
3442
+ handlePlanUpdatedNotification(parsed) {
3443
+ const timelineItem = mapCodexPlanToToolCall({
3444
+ callId: `plan:${this.currentTurnId ?? this.currentThreadId ?? "current"}`,
3445
+ text: planStepsToMarkdown(parsed.plan.map((entry) => ({
3446
+ step: entry.step ?? "",
3447
+ status: entry.status ?? "pending",
3448
+ }))),
3449
+ });
3450
+ if (timelineItem) {
3451
+ this.rememberPlanResult(timelineItem);
3452
+ // In plan mode, the same plan is rendered through the synthetic approval
3453
+ // permission. Keep the remembered text for that card, but do not also
3454
+ // emit a static timeline plan panel.
3455
+ if (this.planModeEnabled) {
3456
+ return;
3457
+ }
3458
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3459
+ }
3460
+ }
3461
+ handleTokenUsageUpdatedNotification(parsed) {
3462
+ this.latestUsage = toAgentUsage(parsed.tokenUsage);
3463
+ if (this.latestUsage) {
3464
+ this.notifySubscribers({
3465
+ type: "usage_updated",
3466
+ provider: CODEX_PROVIDER,
3467
+ usage: this.latestUsage,
3468
+ });
3469
+ }
3470
+ }
3471
+ resolveContextCompactionTrigger(itemId) {
3472
+ if (itemId) {
3473
+ const known = this.compactionTriggerByItemId.get(itemId);
3474
+ if (known) {
3475
+ return known;
3476
+ }
3477
+ }
3478
+ if (this.pendingManualCompactionStarts > 0) {
3479
+ this.pendingManualCompactionStarts -= 1;
3480
+ return "manual";
3481
+ }
3482
+ return undefined;
3483
+ }
3484
+ createContextCompactionTimelineItem(status, itemId) {
3485
+ const trigger = this.resolveContextCompactionTrigger(itemId);
3486
+ if (itemId && trigger) {
3487
+ if (status === "loading") {
3488
+ this.compactionTriggerByItemId.set(itemId, trigger);
3489
+ }
3490
+ else {
3491
+ this.compactionTriggerByItemId.delete(itemId);
3492
+ }
3493
+ }
3494
+ return {
3495
+ type: "compaction",
3496
+ status,
3497
+ ...(trigger ? { trigger } : {}),
3498
+ };
3499
+ }
3500
+ isContextCompactionItem(item) {
3501
+ return (normalizeCodexThreadItemType(typeof item.type === "string" ? item.type : undefined) ===
3502
+ CODEX_CONTEXT_COMPACTION_TYPE);
3503
+ }
3504
+ handleContextCompactedNotification(parsed) {
3505
+ if (parsed.threadId !== this.currentThreadId) {
3506
+ return;
3507
+ }
3508
+ if (this.unpairedCompactionItemCompletions > 0) {
3509
+ this.unpairedCompactionItemCompletions -= 1;
3510
+ return;
3511
+ }
3512
+ this.unpairedCompactionNotificationCompletions += 1;
3513
+ this.emitEvent({
3514
+ type: "timeline",
3515
+ provider: CODEX_PROVIDER,
3516
+ item: this.createContextCompactionTimelineItem("completed"),
3517
+ ...(parsed.turnId ? { turnId: parsed.turnId } : {}),
3518
+ });
3519
+ }
3520
+ handleExecCommandStartedNotification(parsed) {
3521
+ if (parsed.callId) {
3522
+ this.emittedExecCommandStartedCallIds.add(parsed.callId);
3523
+ this.pendingCommandOutputDeltas.delete(parsed.callId);
3524
+ }
3525
+ const timelineItem = mapCodexExecNotificationToToolCall({
3526
+ callId: parsed.callId,
3527
+ command: parsed.command,
3528
+ cwd: parsed.cwd ?? this.config.cwd ?? null,
3529
+ running: true,
3530
+ });
3531
+ if (timelineItem) {
3532
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3533
+ }
3534
+ }
3535
+ handleExecCommandCompletedNotification(parsed) {
3536
+ const bufferedOutput = this.consumeOutputDelta(this.pendingCommandOutputDeltas, parsed.callId);
3537
+ const resolvedOutput = parsed.output ?? bufferedOutput;
3538
+ this.rememberTerminalProcessForCommand(parsed.command, resolvedOutput);
3539
+ const timelineItem = mapCodexExecNotificationToToolCall({
3540
+ callId: parsed.callId,
3541
+ command: parsed.command,
3542
+ cwd: parsed.cwd ?? this.config.cwd ?? null,
3543
+ output: resolvedOutput,
3544
+ exitCode: parsed.exitCode,
3545
+ success: parsed.success,
3546
+ stderr: parsed.stderr,
3547
+ running: false,
3548
+ });
3549
+ if (timelineItem) {
3550
+ this.emittedExecCommandCompletedCallIds.add(timelineItem.callId);
3551
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3552
+ }
3553
+ }
3554
+ handleTerminalInteractionNotification(parsed) {
3555
+ const interactionKey = [parsed.processId ?? "", parsed.stdin ?? ""].join("\u0000");
3556
+ if (!this.shouldEmitTerminalInteractionKey(interactionKey)) {
3557
+ return;
3558
+ }
3559
+ const command = (parsed.processId ? this.terminalCommandByProcessId.get(parsed.processId) : undefined) ??
3560
+ null;
3561
+ if (!command && parsed.processId) {
3562
+ this.pendingUnlabeledTerminalInteractions.add(parsed.processId);
3563
+ }
3564
+ const timelineItem = mapCodexTerminalInteractionToToolCall({
3565
+ processId: parsed.processId,
3566
+ fallbackCallId: parsed.callId,
3567
+ command,
3568
+ });
3569
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3570
+ }
3571
+ handlePatchApplyStartedNotification(parsed) {
3572
+ if (parsed.callId) {
3573
+ this.pendingFileChangeOutputDeltas.delete(parsed.callId);
3574
+ }
3575
+ const timelineItem = mapCodexPatchNotificationToToolCall({
3576
+ callId: parsed.callId,
3577
+ changes: parsed.changes,
3578
+ cwd: this.config.cwd ?? null,
3579
+ running: true,
3580
+ });
3581
+ if (timelineItem) {
3582
+ this.warnOnIncompleteEditToolCall(timelineItem, "patch_apply_started", {
3583
+ callId: parsed.callId,
3584
+ changes: parsed.changes,
3585
+ });
3586
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3587
+ }
3588
+ }
3589
+ handlePatchApplyCompletedNotification(parsed) {
3590
+ const bufferedOutput = this.consumeOutputDelta(this.pendingFileChangeOutputDeltas, parsed.callId);
3591
+ const timelineItem = mapCodexPatchNotificationToToolCall({
3592
+ callId: parsed.callId,
3593
+ changes: parsed.changes,
3594
+ cwd: this.config.cwd ?? null,
3595
+ stdout: parsed.stdout ?? bufferedOutput,
3596
+ stderr: parsed.stderr,
3597
+ success: parsed.success,
3598
+ running: false,
3599
+ });
3600
+ if (timelineItem) {
3601
+ this.warnOnIncompleteEditToolCall(timelineItem, "patch_apply_completed", {
3602
+ callId: parsed.callId,
3603
+ changes: parsed.changes,
3604
+ stdout: parsed.stdout,
3605
+ });
3606
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3607
+ }
3608
+ }
3609
+ handleItemCompletedNotification(parsed) {
3610
+ // Codex emits mirrored lifecycle notifications via both `codex/event/item_*`
3611
+ // and canonical `item/*`. We render only the canonical channel to avoid
3612
+ // duplicated assistant/reasoning rows.
3613
+ if (parsed.source === "codex_event") {
3614
+ return;
3615
+ }
3616
+ if (this.isContextCompactionItem(parsed.item)) {
3617
+ if (this.unpairedCompactionNotificationCompletions > 0) {
3618
+ this.unpairedCompactionNotificationCompletions -= 1;
3619
+ return;
3620
+ }
3621
+ this.emitEvent({
3622
+ type: "timeline",
3623
+ provider: CODEX_PROVIDER,
3624
+ item: this.createContextCompactionTimelineItem("completed", parsed.item.id),
3625
+ });
3626
+ this.unpairedCompactionItemCompletions += 1;
3627
+ return;
3628
+ }
3629
+ const timelineItem = threadItemToTimeline(parsed.item, {
3630
+ includeUserMessage: false,
3631
+ cwd: this.config.cwd ?? null,
3632
+ });
3633
+ if (!timelineItem) {
3634
+ return;
3635
+ }
3636
+ const childSubAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3637
+ if (childSubAgentCallId) {
3638
+ this.handleSubAgentChildItemCompleted(childSubAgentCallId, parsed.item.id, timelineItem);
3639
+ return;
3640
+ }
3641
+ const normalizedItemType = normalizeCodexThreadItemType(typeof parsed.item.type === "string" ? parsed.item.type : undefined);
3642
+ const itemId = parsed.item.id;
3643
+ if (this.shouldSkipCompletedThreadItem(timelineItem, normalizedItemType, itemId)) {
3644
+ return;
3645
+ }
3646
+ if (this.consumeStreamedTextCompletion(timelineItem, itemId)) {
3647
+ if (timelineItem.type === "assistant_message") {
3648
+ this.pendingAssistantMessageBoundary = true;
3649
+ }
3650
+ if (itemId) {
3651
+ this.emittedItemCompletedIds.add(itemId);
3652
+ this.emittedItemStartedIds.delete(itemId);
3653
+ }
3654
+ return;
3655
+ }
3656
+ this.applyBufferedDeltaTextToTimelineItem(timelineItem, itemId);
3657
+ if (timelineItem.type === "tool_call") {
3658
+ this.registerSubAgentToolCall(timelineItem, parsed.item);
3659
+ if (timelineItem.detail.type === "plan") {
3660
+ this.rememberPlanResult(timelineItem);
3661
+ // Codex can surface plans both as turn/plan updates and as completed
3662
+ // thread items. In plan mode, approval owns the visible plan card.
3663
+ if (this.planModeEnabled) {
3664
+ return;
3665
+ }
3666
+ }
3667
+ this.warnOnIncompleteEditToolCall(timelineItem, "item_completed", parsed.item);
3668
+ }
3669
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3670
+ if (timelineItem.type === "assistant_message") {
3671
+ this.pendingAssistantMessageBoundary = true;
3672
+ }
3673
+ if (itemId) {
3674
+ this.emittedItemCompletedIds.add(itemId);
3675
+ this.emittedItemStartedIds.delete(itemId);
3676
+ this.pendingCommandOutputDeltas.delete(itemId);
3677
+ this.pendingFileChangeOutputDeltas.delete(itemId);
3678
+ }
3679
+ }
3680
+ consumeStreamedTextCompletion(timelineItem, itemId) {
3681
+ if (!itemId) {
3682
+ return false;
3683
+ }
3684
+ if (timelineItem.type === "assistant_message" && this.pendingAgentMessages.has(itemId)) {
3685
+ const streamedText = this.pendingAgentMessages.get(itemId) ?? "";
3686
+ this.pendingAgentMessages.delete(itemId);
3687
+ this.emitMissingFinalTextSuffix(timelineItem, streamedText);
3688
+ return true;
3689
+ }
3690
+ if (timelineItem.type === "reasoning" && this.pendingReasoning.has(itemId)) {
3691
+ const streamedText = this.pendingReasoning.get(itemId)?.join("") ?? "";
3692
+ this.pendingReasoning.delete(itemId);
3693
+ this.emitMissingFinalTextSuffix(timelineItem, streamedText);
3694
+ return true;
3695
+ }
3696
+ return false;
3697
+ }
3698
+ emitMissingFinalTextSuffix(timelineItem, streamedText) {
3699
+ if (!timelineItem.text.startsWith(streamedText)) {
3700
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3701
+ return;
3702
+ }
3703
+ const suffix = timelineItem.text.slice(streamedText.length);
3704
+ if (!suffix) {
3705
+ return;
3706
+ }
3707
+ this.emitEvent({
3708
+ type: "timeline",
3709
+ provider: CODEX_PROVIDER,
3710
+ item: timelineItem.type === "assistant_message"
3711
+ ? {
3712
+ type: timelineItem.type,
3713
+ text: suffix,
3714
+ ...(timelineItem.messageId ? { messageId: timelineItem.messageId } : {}),
3715
+ }
3716
+ : { type: timelineItem.type, text: suffix },
3717
+ });
3718
+ }
3719
+ applyBufferedDeltaTextToTimelineItem(timelineItem, itemId) {
3720
+ if (!itemId) {
3721
+ return;
3722
+ }
3723
+ if (timelineItem.type === "assistant_message") {
3724
+ const buffered = this.pendingAgentMessages.get(itemId);
3725
+ if (buffered && buffered.length > 0) {
3726
+ timelineItem.text = buffered;
3727
+ }
3728
+ return;
3729
+ }
3730
+ if (timelineItem.type === "reasoning") {
3731
+ const buffered = this.pendingReasoning.get(itemId);
3732
+ if (buffered && buffered.length > 0) {
3733
+ timelineItem.text = buffered.join("");
3734
+ }
3735
+ }
3736
+ }
3737
+ handleItemStartedNotification(parsed) {
3738
+ if (parsed.source === "codex_event") {
3739
+ return;
3740
+ }
3741
+ if (this.isContextCompactionItem(parsed.item)) {
3742
+ this.emitEvent({
3743
+ type: "timeline",
3744
+ provider: CODEX_PROVIDER,
3745
+ item: this.createContextCompactionTimelineItem("loading", parsed.item.id),
3746
+ });
3747
+ return;
3748
+ }
3749
+ const timelineItem = threadItemToTimeline(parsed.item, {
3750
+ includeUserMessage: false,
3751
+ cwd: this.config.cwd ?? null,
3752
+ });
3753
+ if (!timelineItem || timelineItem.type !== "tool_call") {
3754
+ return;
3755
+ }
3756
+ const childSubAgentCallId = this.getSubAgentCallIdForThread(parsed.threadId);
3757
+ if (childSubAgentCallId) {
3758
+ if (parsed.item.id) {
3759
+ this.upsertSubAgentChildItem(childSubAgentCallId, parsed.item.id, timelineItem);
3760
+ }
3761
+ this.emitSubAgentActivityUpdate(childSubAgentCallId, "running");
3762
+ return;
3763
+ }
3764
+ const normalizedItemType = normalizeCodexThreadItemType(typeof parsed.item.type === "string" ? parsed.item.type : undefined);
3765
+ const itemId = parsed.item.id;
3766
+ if (normalizedItemType === "commandExecution") {
3767
+ const callId = timelineItem.callId || itemId;
3768
+ if (callId && this.emittedExecCommandStartedCallIds.has(callId)) {
3769
+ return;
3770
+ }
3771
+ }
3772
+ if (itemId && this.emittedItemStartedIds.has(itemId)) {
3773
+ return;
3774
+ }
3775
+ this.warnOnIncompleteEditToolCall(timelineItem, "item_started", parsed.item);
3776
+ this.registerSubAgentToolCall(timelineItem, parsed.item);
3777
+ this.emitEvent({ type: "timeline", provider: CODEX_PROVIDER, item: timelineItem });
3778
+ if (itemId) {
3779
+ this.emittedItemStartedIds.add(itemId);
3780
+ this.pendingCommandOutputDeltas.delete(itemId);
3781
+ this.pendingFileChangeOutputDeltas.delete(itemId);
3782
+ }
3783
+ }
3784
+ warnUnknownNotificationMethod(method, params) {
3785
+ if (this.warnedUnknownNotificationMethods.has(method)) {
3786
+ return;
3787
+ }
3788
+ this.warnedUnknownNotificationMethods.add(method);
3789
+ this.logger.trace({
3790
+ agentId: this.agentId,
3791
+ provider: CODEX_PROVIDER,
3792
+ sessionId: this.currentThreadId,
3793
+ turnId: this.activeForegroundTurnId ?? undefined,
3794
+ method,
3795
+ params,
3796
+ }, "provider.codex.event_unhandled");
3797
+ }
3798
+ warnInvalidNotificationPayload(method, params) {
3799
+ const key = method;
3800
+ if (this.warnedInvalidNotificationPayloads.has(key)) {
3801
+ return;
3802
+ }
3803
+ this.warnedInvalidNotificationPayloads.add(key);
3804
+ this.logger.warn({ method, params }, "Invalid Codex app-server notification payload");
3805
+ }
3806
+ appendOutputDeltaChunk(store, id, chunk, options) {
3807
+ if (!id || !chunk) {
3808
+ return;
3809
+ }
3810
+ const normalized = options?.decodeBase64 ? decodeCodexOutputDeltaChunk(chunk) : chunk;
3811
+ if (!normalized.length) {
3812
+ return;
3813
+ }
3814
+ const prev = store.get(id) ?? [];
3815
+ prev.push(normalized);
3816
+ store.set(id, prev);
3817
+ }
3818
+ consumeOutputDelta(store, id) {
3819
+ if (!id) {
3820
+ return null;
3821
+ }
3822
+ const buffered = store.get(id);
3823
+ if (!buffered || buffered.length === 0) {
3824
+ return null;
3825
+ }
3826
+ store.delete(id);
3827
+ return buffered.join("");
3828
+ }
3829
+ rememberTerminalProcessForCommand(command, output) {
3830
+ const normalizedCommand = normalizeCodexCommandValue(command);
3831
+ if (!normalizedCommand) {
3832
+ return;
3833
+ }
3834
+ const displayCommand = typeof normalizedCommand === "string"
3835
+ ? normalizedCommand
3836
+ : normalizedCommand.join(" ").trim();
3837
+ if (!displayCommand) {
3838
+ return;
3839
+ }
3840
+ const processId = extractCodexTerminalSessionId(output ?? undefined);
3841
+ if (!processId) {
3842
+ return;
3843
+ }
3844
+ this.terminalCommandByProcessId.set(processId, displayCommand);
3845
+ if (!this.pendingUnlabeledTerminalInteractions.has(processId)) {
3846
+ return;
3847
+ }
3848
+ this.pendingUnlabeledTerminalInteractions.delete(processId);
3849
+ this.emitEvent({
3850
+ type: "timeline",
3851
+ provider: CODEX_PROVIDER,
3852
+ item: mapCodexTerminalInteractionToToolCall({
3853
+ processId,
3854
+ command: displayCommand,
3855
+ }),
3856
+ });
3857
+ }
3858
+ shouldEmitTerminalInteractionKey(key) {
3859
+ if (this.emittedTerminalInteractionKeys.has(key)) {
3860
+ return false;
3861
+ }
3862
+ this.emittedTerminalInteractionKeys.add(key);
3863
+ return true;
3864
+ }
3865
+ warnOnIncompleteEditToolCall(item, source, payload) {
3866
+ if (!isEditToolCallWithoutContent(item)) {
3867
+ return;
3868
+ }
3869
+ const warnKey = `${source}:${item.callId}`;
3870
+ if (this.warnedIncompleteEditToolCallIds.has(warnKey)) {
3871
+ return;
3872
+ }
3873
+ this.warnedIncompleteEditToolCallIds.add(warnKey);
3874
+ this.logger.warn({
3875
+ source,
3876
+ callId: item.callId,
3877
+ status: item.status,
3878
+ name: item.name,
3879
+ detail: item.detail,
3880
+ payload,
3881
+ }, "Codex edit tool call is missing diff/content fields");
3882
+ }
3883
+ handleCommandApprovalRequest(params) {
3884
+ const parsed = z
3885
+ .object({
3886
+ itemId: z.string(),
3887
+ threadId: z.string(),
3888
+ turnId: z.string(),
3889
+ command: z.string().nullable().optional(),
3890
+ cwd: z.string().nullable().optional(),
3891
+ reason: z.string().nullable().optional(),
3892
+ })
3893
+ .parse(params);
3894
+ const commandPreview = mapCodexExecNotificationToToolCall({
3895
+ callId: parsed.itemId,
3896
+ command: parsed.command,
3897
+ cwd: parsed.cwd ?? this.config.cwd ?? null,
3898
+ running: true,
3899
+ });
3900
+ const requestId = `permission-${parsed.itemId}`;
3901
+ const title = parsed.command ? `Run command: ${parsed.command}` : "Run command";
3902
+ const request = {
3903
+ id: requestId,
3904
+ provider: CODEX_PROVIDER,
3905
+ name: "CodexBash",
3906
+ kind: "tool",
3907
+ title,
3908
+ description: parsed.reason ?? undefined,
3909
+ input: {
3910
+ command: parsed.command ?? undefined,
3911
+ cwd: parsed.cwd ?? undefined,
3912
+ },
3913
+ detail: commandPreview?.detail ?? {
3914
+ type: "unknown",
3915
+ input: {
3916
+ command: parsed.command ?? null,
3917
+ cwd: parsed.cwd ?? null,
3918
+ },
3919
+ output: null,
3920
+ },
3921
+ metadata: {
3922
+ itemId: parsed.itemId,
3923
+ threadId: parsed.threadId,
3924
+ turnId: parsed.turnId,
3925
+ },
3926
+ };
3927
+ this.pendingPermissions.set(requestId, request);
3928
+ this.emitEvent({ type: "permission_requested", provider: CODEX_PROVIDER, request });
3929
+ return new Promise((resolve) => {
3930
+ this.pendingPermissionHandlers.set(requestId, { resolve, kind: "command" });
3931
+ });
3932
+ }
3933
+ handleFileChangeApprovalRequest(params) {
3934
+ const parsed = z
3935
+ .object({
3936
+ itemId: z.string(),
3937
+ threadId: z.string(),
3938
+ turnId: z.string(),
3939
+ reason: z.string().nullable().optional(),
3940
+ })
3941
+ .parse(params);
3942
+ const requestId = `permission-${parsed.itemId}`;
3943
+ const request = {
3944
+ id: requestId,
3945
+ provider: CODEX_PROVIDER,
3946
+ name: "CodexFileChange",
3947
+ kind: "tool",
3948
+ title: "Apply file changes",
3949
+ description: parsed.reason ?? undefined,
3950
+ detail: {
3951
+ type: "unknown",
3952
+ input: {
3953
+ reason: parsed.reason ?? null,
3954
+ },
3955
+ output: null,
3956
+ },
3957
+ metadata: {
3958
+ itemId: parsed.itemId,
3959
+ threadId: parsed.threadId,
3960
+ turnId: parsed.turnId,
3961
+ },
3962
+ };
3963
+ this.pendingPermissions.set(requestId, request);
3964
+ this.emitEvent({ type: "permission_requested", provider: CODEX_PROVIDER, request });
3965
+ return new Promise((resolve) => {
3966
+ this.pendingPermissionHandlers.set(requestId, { resolve, kind: "file" });
3967
+ });
3968
+ }
3969
+ handleToolApprovalRequest(params) {
3970
+ const parsed = z
3971
+ .object({
3972
+ itemId: z.string(),
3973
+ threadId: z.string(),
3974
+ turnId: z.string(),
3975
+ questions: z.array(z.unknown()),
3976
+ })
3977
+ .parse(params);
3978
+ const requestId = `permission-${parsed.itemId}`;
3979
+ const questions = normalizeCodexQuestionPrompts(parsed.questions);
3980
+ const request = {
3981
+ id: requestId,
3982
+ provider: CODEX_PROVIDER,
3983
+ name: "request_user_input",
3984
+ kind: "question",
3985
+ title: "Question",
3986
+ description: undefined,
3987
+ detail: {
3988
+ type: "plain_text",
3989
+ text: formatCodexQuestionPrompts(questions),
3990
+ icon: "brain",
3991
+ },
3992
+ input: { questions },
3993
+ metadata: {
3994
+ itemId: parsed.itemId,
3995
+ threadId: parsed.threadId,
3996
+ turnId: parsed.turnId,
3997
+ questions,
3998
+ },
3999
+ };
4000
+ this.pendingPermissions.set(requestId, request);
4001
+ this.emitEvent({
4002
+ type: "timeline",
4003
+ provider: CODEX_PROVIDER,
4004
+ item: mapCodexQuestionRequestToToolCall({
4005
+ callId: parsed.itemId,
4006
+ questions,
4007
+ status: "running",
4008
+ }),
4009
+ });
4010
+ this.emitEvent({ type: "permission_requested", provider: CODEX_PROVIDER, request });
4011
+ return new Promise((resolve) => {
4012
+ this.pendingPermissionHandlers.set(requestId, {
4013
+ resolve,
4014
+ kind: "question",
4015
+ questions,
4016
+ });
4017
+ });
4018
+ }
4019
+ }
4020
+ export class CodexAppServerAgentClient {
4021
+ constructor(logger, runtimeSettings, deps = {}) {
4022
+ this.logger = logger;
4023
+ this.runtimeSettings = runtimeSettings;
4024
+ this.deps = deps;
4025
+ this.provider = CODEX_PROVIDER;
4026
+ this.capabilities = CODEX_APP_SERVER_CAPABILITIES;
4027
+ this.goalsEnabledPromise = null;
4028
+ this.autoReviewEnabledPromise = null;
4029
+ }
4030
+ sessionDeps() {
4031
+ return {
4032
+ ...this.deps,
4033
+ customCodexConfig: buildCodexCustomProviderConfig(this.runtimeSettings, this.deps.customProvider),
4034
+ };
4035
+ }
4036
+ resolveGoalsEnabled() {
4037
+ if (!this.goalsEnabledPromise) {
4038
+ this.goalsEnabledPromise = (async () => {
4039
+ try {
4040
+ const launchPrefix = await resolveCodexLaunchPrefix(this.runtimeSettings);
4041
+ const versionOutput = await resolveBinaryVersion(launchPrefix.command);
4042
+ const enabled = codexVersionAtLeast(versionOutput, CODEX_GOALS_MIN_VERSION);
4043
+ this.logger.trace({
4044
+ provider: CODEX_PROVIDER,
4045
+ versionOutput,
4046
+ enabled,
4047
+ }, "provider.codex.config.goals_resolved");
4048
+ return enabled;
4049
+ }
4050
+ catch (error) {
4051
+ this.logger.warn({ err: error }, "Failed to probe codex version for goals gate");
4052
+ return false;
4053
+ }
4054
+ })();
4055
+ }
4056
+ return this.goalsEnabledPromise;
4057
+ }
4058
+ resolveAutoReviewEnabled() {
4059
+ if (!this.autoReviewEnabledPromise) {
4060
+ this.autoReviewEnabledPromise = (async () => {
4061
+ try {
4062
+ const launchPrefix = await resolveCodexLaunchPrefix(this.runtimeSettings);
4063
+ const versionOutput = await resolveBinaryVersion(launchPrefix.command);
4064
+ const enabled = codexVersionAtLeast(versionOutput, CODEX_AUTO_REVIEW_MIN_VERSION);
4065
+ this.logger.trace({
4066
+ provider: CODEX_PROVIDER,
4067
+ versionOutput,
4068
+ enabled,
4069
+ }, "provider.codex.config.auto_review_resolved");
4070
+ return enabled;
4071
+ }
4072
+ catch (error) {
4073
+ this.logger.warn({ err: error }, "Failed to probe codex version for auto-review gate");
4074
+ return false;
4075
+ }
4076
+ })();
4077
+ }
4078
+ return this.autoReviewEnabledPromise;
4079
+ }
4080
+ async spawnAppServer(launchEnv, options) {
4081
+ const launchPrefix = await resolveCodexLaunchPrefix(this.runtimeSettings);
4082
+ const args = [...launchPrefix.args, "app-server"];
4083
+ if (options?.goalsEnabled) {
4084
+ args.push("--enable", "goals");
4085
+ }
4086
+ this.logger.trace({
4087
+ agentId: options?.agentId,
4088
+ provider: CODEX_PROVIDER,
4089
+ launchPrefix,
4090
+ goalsEnabled: options?.goalsEnabled === true,
4091
+ }, "provider.codex.spawn");
4092
+ const child = spawnProcess(launchPrefix.command, args, {
4093
+ detached: process.platform !== "win32",
4094
+ stdio: ["pipe", "pipe", "pipe"],
4095
+ ...createProviderEnvSpec({
4096
+ runtimeSettings: this.runtimeSettings,
4097
+ overlays: [launchEnv],
4098
+ }),
4099
+ });
4100
+ assertChildWithPipes(child);
4101
+ return child;
4102
+ }
4103
+ async createSession(config, launchContext, options) {
4104
+ if (options?.persistSession === false) {
4105
+ this.logger.debug("Codex app-server does not expose an ephemeral-session option; persistSession=false is currently a no-op");
4106
+ // TODO: Honor persistSession=false if app-server adds support, or route
4107
+ // utility generations through `codex exec --ephemeral` in a larger change.
4108
+ }
4109
+ const sessionConfig = { ...config, provider: CODEX_PROVIDER };
4110
+ const goalsEnabled = await this.resolveGoalsEnabled();
4111
+ const autoReviewEnabled = await this.resolveAutoReviewEnabled();
4112
+ const session = new CodexAppServerAgentSession(sessionConfig, null, this.logger, () => this.spawnAppServer(launchContext?.env, { goalsEnabled, agentId: launchContext?.agentId }), this.sessionDeps(), options?.persistSession === false, goalsEnabled, autoReviewEnabled, launchContext?.agentId);
4113
+ await session.connect();
4114
+ return session;
4115
+ }
4116
+ async resumeSession(handle, overrides, launchContext) {
4117
+ const storedConfig = (handle.metadata ?? {});
4118
+ const merged = {
4119
+ ...storedConfig,
4120
+ ...overrides,
4121
+ provider: CODEX_PROVIDER,
4122
+ cwd: overrides?.cwd ?? storedConfig.cwd ?? process.cwd(),
4123
+ };
4124
+ const goalsEnabled = await this.resolveGoalsEnabled();
4125
+ const autoReviewEnabled = await this.resolveAutoReviewEnabled();
4126
+ const session = new CodexAppServerAgentSession(merged, handle, this.logger, () => this.spawnAppServer(launchContext?.env, { goalsEnabled, agentId: launchContext?.agentId }), this.sessionDeps(), false, goalsEnabled, autoReviewEnabled, launchContext?.agentId);
4127
+ await session.connect();
4128
+ return session;
4129
+ }
4130
+ async listPersistedAgents(options) {
4131
+ const child = await this.spawnAppServer();
4132
+ const client = this.deps._createCodexClient?.(child, this.logger, () => ({})) ??
4133
+ new CodexAppServerClient(child, this.logger);
4134
+ try {
4135
+ await client.request("initialize", buildCodexAppServerInitializeParams());
4136
+ client.notify("initialized", {});
4137
+ const limit = options?.limit ?? 20;
4138
+ // thread/list returns the cheap `cwd` field. When the caller supplied
4139
+ // a cwd hint we filter here so the per-thread `thread/read includeTurns`
4140
+ // hydration below only runs for matching threads. Fetch a wider window
4141
+ // when filtering since most threads will be from other cwds.
4142
+ const listLimit = options?.cwd ? Math.max(limit, 50) : limit;
4143
+ const response = toObjectRecord(await client.request("thread/list", { limit: listLimit }));
4144
+ const allThreads = Array.isArray(response?.data) ? response.data.filter(isRecord) : [];
4145
+ const threads = filterCodexThreadsByCwd(allThreads, options?.cwd);
4146
+ const descriptors = await Promise.all(threads.slice(0, limit).map(async (thread) => {
4147
+ const threadId = typeof thread.id === "string" ? thread.id : "";
4148
+ const cwd = typeof thread.cwd === "string" ? thread.cwd : process.cwd();
4149
+ const title = typeof thread.preview === "string" ? thread.preview : null;
4150
+ let timeline = [];
4151
+ try {
4152
+ timeline = await loadCodexThreadHistoryTimeline({
4153
+ threadId,
4154
+ cwd,
4155
+ requestThread: (threadIdToRead) => {
4156
+ return readCodexThread(client, threadIdToRead);
4157
+ },
4158
+ });
4159
+ }
4160
+ catch {
4161
+ timeline = [];
4162
+ }
4163
+ return {
4164
+ provider: CODEX_PROVIDER,
4165
+ sessionId: threadId,
4166
+ cwd,
4167
+ title,
4168
+ lastActivityAt: new Date(((typeof thread.updatedAt === "number" ? thread.updatedAt : undefined) ??
4169
+ (typeof thread.createdAt === "number" ? thread.createdAt : undefined) ??
4170
+ 0) * 1000),
4171
+ persistence: {
4172
+ provider: CODEX_PROVIDER,
4173
+ sessionId: threadId,
4174
+ nativeHandle: threadId,
4175
+ metadata: {
4176
+ provider: CODEX_PROVIDER,
4177
+ cwd,
4178
+ title,
4179
+ threadId,
4180
+ },
4181
+ },
4182
+ timeline: timeline.map((entry) => entry.item),
4183
+ };
4184
+ }));
4185
+ return descriptors;
4186
+ }
4187
+ finally {
4188
+ await client.dispose();
4189
+ }
4190
+ }
4191
+ async listModels(_options) {
4192
+ // Codex model/list is global to the app server in this flow; cwd/force are intentionally ignored.
4193
+ const child = await this.spawnAppServer();
4194
+ const client = new CodexAppServerClient(child, this.logger);
4195
+ try {
4196
+ await client.request("initialize", buildCodexAppServerInitializeParams());
4197
+ client.notify("initialized", {});
4198
+ const rawResponse = await client.request("model/list", {});
4199
+ const parsedResponse = CodexModelListResponseSchema.safeParse(rawResponse);
4200
+ const models = parsedResponse.success ? (parsedResponse.data.data ?? []) : [];
4201
+ const configuredDefaults = await readCodexConfiguredDefaults(client, this.logger);
4202
+ const configuredDefaultModelId = configuredDefaults.model;
4203
+ const configuredDefaultThinkingOptionId = configuredDefaults.thinkingOptionId;
4204
+ const hasConfiguredDefaultModel = typeof configuredDefaultModelId === "string"
4205
+ ? models.some((model) => model?.id === configuredDefaultModelId)
4206
+ : false;
4207
+ return models.map((model) => buildCodexModelDefinition(model, {
4208
+ configuredDefaultModelId,
4209
+ configuredDefaultThinkingOptionId,
4210
+ hasConfiguredDefaultModel,
4211
+ }));
4212
+ }
4213
+ finally {
4214
+ await client.dispose();
4215
+ }
4216
+ }
4217
+ async archiveNativeSession(handle) {
4218
+ const threadId = handle.nativeHandle ?? handle.sessionId;
4219
+ if (!threadId)
4220
+ return;
4221
+ const child = await this.spawnAppServer();
4222
+ const client = new CodexAppServerClient(child, this.logger);
4223
+ try {
4224
+ await client.request("initialize", buildCodexAppServerInitializeParams());
4225
+ client.notify("initialized", {});
4226
+ await client.request("thread/archive", { threadId });
4227
+ }
4228
+ finally {
4229
+ await client.dispose();
4230
+ }
4231
+ }
4232
+ async isAvailable() {
4233
+ const command = this.runtimeSettings?.command;
4234
+ if (command?.mode === "replace") {
4235
+ return await isCommandAvailable(command.argv[0]);
4236
+ }
4237
+ return (await findDefaultCodexBinary()) !== null;
4238
+ }
4239
+ async getDiagnostic() {
4240
+ try {
4241
+ const available = await this.isAvailable();
4242
+ const resolvedBinary = await findDefaultCodexBinary();
4243
+ const entries = [
4244
+ {
4245
+ label: "Binary",
4246
+ value: resolvedBinary ?? "not found",
4247
+ },
4248
+ {
4249
+ label: "Version",
4250
+ value: resolvedBinary ? await resolveBinaryVersion(resolvedBinary) : "unknown",
4251
+ },
4252
+ ];
4253
+ let status = formatDiagnosticStatus(available);
4254
+ if (!available) {
4255
+ entries.push({ label: "Models", value: "Not checked" });
4256
+ }
4257
+ else {
4258
+ try {
4259
+ const models = await this.listModels({ cwd: homedir(), force: false });
4260
+ entries.push({ label: "Models", value: String(models.length) });
4261
+ }
4262
+ catch (error) {
4263
+ entries.push({
4264
+ label: "Models",
4265
+ value: `Error - ${toDiagnosticErrorMessage(error)}`,
4266
+ });
4267
+ status = formatDiagnosticStatus(available, {
4268
+ source: "model fetch",
4269
+ cause: error,
4270
+ });
4271
+ }
4272
+ }
4273
+ entries.push({ label: "Status", value: status });
4274
+ return {
4275
+ diagnostic: formatProviderDiagnostic("Codex", entries),
4276
+ };
4277
+ }
4278
+ catch (error) {
4279
+ return {
4280
+ diagnostic: formatProviderDiagnosticError("Codex", error),
4281
+ };
4282
+ }
4283
+ }
4284
+ }
4285
+ function buildCodexModelDefinition(model, ctx) {
4286
+ const defaultReasoningEffort = normalizeCodexThinkingOptionId(typeof model.defaultReasoningEffort === "string" ? model.defaultReasoningEffort : null);
4287
+ const resolvedDefaultReasoningEffort = ctx.configuredDefaultThinkingOptionId ?? defaultReasoningEffort;
4288
+ const thinkingById = buildCodexThinkingOptionMap(model.supportedReasoningEfforts, resolvedDefaultReasoningEffort, ctx.configuredDefaultThinkingOptionId);
4289
+ const thinkingOptions = Array.from(thinkingById.values()).map((option) => Object.assign({}, option, {
4290
+ isDefault: option.id === resolvedDefaultReasoningEffort,
4291
+ }));
4292
+ const defaultThinkingOptionId = resolvedDefaultReasoningEffort ??
4293
+ thinkingOptions.find((option) => option.isDefault)?.id ??
4294
+ thinkingOptions[0]?.id;
4295
+ const isDefaultModel = ctx.hasConfiguredDefaultModel
4296
+ ? model.id === ctx.configuredDefaultModelId
4297
+ : model.isDefault;
4298
+ return {
4299
+ provider: CODEX_PROVIDER,
4300
+ id: model.id,
4301
+ label: normalizeCodexModelLabel(model.displayName ?? ""),
4302
+ description: model.description,
4303
+ isDefault: isDefaultModel,
4304
+ thinkingOptions: thinkingOptions.length > 0 ? thinkingOptions : undefined,
4305
+ defaultThinkingOptionId,
4306
+ metadata: {
4307
+ model: model.model,
4308
+ defaultReasoningEffort: model.defaultReasoningEffort,
4309
+ supportedReasoningEfforts: model.supportedReasoningEfforts,
4310
+ },
4311
+ };
4312
+ }
4313
+ function buildCodexThinkingOptionMap(supportedReasoningEfforts, resolvedDefaultReasoningEffort, configuredDefaultThinkingOptionId) {
4314
+ const thinkingById = new Map();
4315
+ if (Array.isArray(supportedReasoningEfforts)) {
4316
+ for (const entry of supportedReasoningEfforts) {
4317
+ const id = normalizeCodexThinkingOptionId(typeof entry?.reasoningEffort === "string" ? entry.reasoningEffort : null);
4318
+ if (!id)
4319
+ continue;
4320
+ const description = typeof entry?.description === "string" && entry.description.trim().length > 0
4321
+ ? entry.description
4322
+ : undefined;
4323
+ thinkingById.set(id, { id, label: id, description });
4324
+ }
4325
+ }
4326
+ if (resolvedDefaultReasoningEffort && !thinkingById.has(resolvedDefaultReasoningEffort)) {
4327
+ thinkingById.set(resolvedDefaultReasoningEffort, {
4328
+ id: resolvedDefaultReasoningEffort,
4329
+ label: resolvedDefaultReasoningEffort,
4330
+ description: configuredDefaultThinkingOptionId === resolvedDefaultReasoningEffort
4331
+ ? "Configured default reasoning effort"
4332
+ : "Model default reasoning effort",
4333
+ });
4334
+ }
4335
+ return thinkingById;
4336
+ }
4337
+ function resolveSkillDescription(skill) {
4338
+ if (typeof skill.description === "string") {
4339
+ return skill.description;
4340
+ }
4341
+ if (typeof skill.shortDescription === "string") {
4342
+ return skill.shortDescription;
4343
+ }
4344
+ return "Skill";
4345
+ }
4346
+ export const __codexAppServerInternals = {
4347
+ buildCodexAppServerEnv,
4348
+ CodexAppServerClient,
4349
+ codexModelSupportsFastMode,
4350
+ CodexAppServerAgentSession,
4351
+ findCodexMicrosoftStoreBinary,
4352
+ findDefaultCodexBinary,
4353
+ formatCodexQuestionPrompts,
4354
+ mapCodexQuestionRequestToToolCall,
4355
+ mapCodexPatchNotificationToToolCall,
4356
+ planStepsToMarkdown,
4357
+ mapCodexPlanToToolCall,
4358
+ listCodexSkills,
4359
+ normalizeCodexOutputSchema,
4360
+ normalizeCodexQuestionPrompts,
4361
+ toAgentUsage,
4362
+ threadItemToTimeline,
4363
+ };
4364
+ //# sourceMappingURL=codex-app-server-agent.js.map