@openclaw/codex 2026.5.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/dist/.boundary-tsc.stamp +1 -0
  2. package/dist/.boundary-tsc.tsbuildinfo +1 -0
  3. package/harness.ts +59 -0
  4. package/index.test.ts +106 -0
  5. package/index.ts +41 -0
  6. package/media-understanding-provider.test.ts +300 -0
  7. package/media-understanding-provider.ts +369 -0
  8. package/openclaw.plugin.json +299 -0
  9. package/package.json +43 -0
  10. package/prompt-overlay-runtime-contract.test.ts +45 -0
  11. package/prompt-overlay.ts +19 -0
  12. package/provider-catalog.ts +83 -0
  13. package/provider-discovery.ts +45 -0
  14. package/provider.test.ts +350 -0
  15. package/provider.ts +223 -0
  16. package/src/app-server/approval-bridge.test.ts +838 -0
  17. package/src/app-server/approval-bridge.ts +731 -0
  18. package/src/app-server/auth-bridge.test.ts +922 -0
  19. package/src/app-server/auth-bridge.ts +345 -0
  20. package/src/app-server/auth-profile-runtime-contract.test.ts +217 -0
  21. package/src/app-server/capabilities.ts +27 -0
  22. package/src/app-server/client-factory.ts +30 -0
  23. package/src/app-server/client.test.ts +414 -0
  24. package/src/app-server/client.ts +575 -0
  25. package/src/app-server/compact.test.ts +452 -0
  26. package/src/app-server/compact.ts +374 -0
  27. package/src/app-server/computer-use.test.ts +790 -0
  28. package/src/app-server/computer-use.ts +682 -0
  29. package/src/app-server/config.test.ts +431 -0
  30. package/src/app-server/config.ts +486 -0
  31. package/src/app-server/context-engine-projection.test.ts +104 -0
  32. package/src/app-server/context-engine-projection.ts +147 -0
  33. package/src/app-server/delivery-no-reply-runtime-contract.test.ts +80 -0
  34. package/src/app-server/dynamic-tools.test.ts +781 -0
  35. package/src/app-server/dynamic-tools.ts +345 -0
  36. package/src/app-server/elicitation-bridge.test.ts +625 -0
  37. package/src/app-server/elicitation-bridge.ts +555 -0
  38. package/src/app-server/event-projector.test.ts +921 -0
  39. package/src/app-server/event-projector.ts +1160 -0
  40. package/src/app-server/managed-binary.test.ts +95 -0
  41. package/src/app-server/managed-binary.ts +121 -0
  42. package/src/app-server/models.test.ts +242 -0
  43. package/src/app-server/models.ts +168 -0
  44. package/src/app-server/native-hook-relay.test.ts +143 -0
  45. package/src/app-server/native-hook-relay.ts +64 -0
  46. package/src/app-server/openclaw-owned-tool-runtime-contract.test.ts +415 -0
  47. package/src/app-server/outcome-fallback-runtime-contract.test.ts +352 -0
  48. package/src/app-server/plugin-approval-roundtrip.ts +122 -0
  49. package/src/app-server/protocol-generated/json/DynamicToolCallParams.json +24 -0
  50. package/src/app-server/protocol-generated/json/v2/ErrorNotification.json +162 -0
  51. package/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +86 -0
  52. package/src/app-server/protocol-generated/json/v2/ModelListResponse.json +162 -0
  53. package/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +1994 -0
  54. package/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +1994 -0
  55. package/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +1243 -0
  56. package/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +1240 -0
  57. package/src/app-server/protocol-generated/typescript/AbsolutePathBuf.ts +14 -0
  58. package/src/app-server/protocol-generated/typescript/AgentPath.ts +5 -0
  59. package/src/app-server/protocol-generated/typescript/ApplyPatchApprovalParams.ts +24 -0
  60. package/src/app-server/protocol-generated/typescript/ApplyPatchApprovalResponse.ts +6 -0
  61. package/src/app-server/protocol-generated/typescript/AuthMode.ts +8 -0
  62. package/src/app-server/protocol-generated/typescript/ClientInfo.ts +5 -0
  63. package/src/app-server/protocol-generated/typescript/ClientNotification.ts +5 -0
  64. package/src/app-server/protocol-generated/typescript/ClientRequest.ts +165 -0
  65. package/src/app-server/protocol-generated/typescript/CollaborationMode.ts +10 -0
  66. package/src/app-server/protocol-generated/typescript/ContentItem.ts +9 -0
  67. package/src/app-server/protocol-generated/typescript/ConversationGitInfo.ts +9 -0
  68. package/src/app-server/protocol-generated/typescript/ConversationSummary.ts +19 -0
  69. package/src/app-server/protocol-generated/typescript/ExecCommandApprovalParams.ts +22 -0
  70. package/src/app-server/protocol-generated/typescript/ExecCommandApprovalResponse.ts +6 -0
  71. package/src/app-server/protocol-generated/typescript/ExecPolicyAmendment.ts +12 -0
  72. package/src/app-server/protocol-generated/typescript/FileChange.ts +8 -0
  73. package/src/app-server/protocol-generated/typescript/ForcedLoginMethod.ts +5 -0
  74. package/src/app-server/protocol-generated/typescript/FunctionCallOutputBody.ts +6 -0
  75. package/src/app-server/protocol-generated/typescript/FunctionCallOutputContentItem.ts +12 -0
  76. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchMatchType.ts +5 -0
  77. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchParams.ts +9 -0
  78. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchResponse.ts +6 -0
  79. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchResult.ts +16 -0
  80. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchSessionCompletedNotification.ts +5 -0
  81. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchSessionUpdatedNotification.ts +10 -0
  82. package/src/app-server/protocol-generated/typescript/GetAuthStatusParams.ts +5 -0
  83. package/src/app-server/protocol-generated/typescript/GetAuthStatusResponse.ts +10 -0
  84. package/src/app-server/protocol-generated/typescript/GetConversationSummaryParams.ts +6 -0
  85. package/src/app-server/protocol-generated/typescript/GetConversationSummaryResponse.ts +6 -0
  86. package/src/app-server/protocol-generated/typescript/GhostCommit.ts +13 -0
  87. package/src/app-server/protocol-generated/typescript/GitDiffToRemoteParams.ts +5 -0
  88. package/src/app-server/protocol-generated/typescript/GitDiffToRemoteResponse.ts +6 -0
  89. package/src/app-server/protocol-generated/typescript/GitSha.ts +5 -0
  90. package/src/app-server/protocol-generated/typescript/ImageDetail.ts +5 -0
  91. package/src/app-server/protocol-generated/typescript/InitializeCapabilities.ts +18 -0
  92. package/src/app-server/protocol-generated/typescript/InitializeParams.ts +10 -0
  93. package/src/app-server/protocol-generated/typescript/InitializeResponse.ts +22 -0
  94. package/src/app-server/protocol-generated/typescript/InputModality.ts +8 -0
  95. package/src/app-server/protocol-generated/typescript/LocalShellAction.ts +6 -0
  96. package/src/app-server/protocol-generated/typescript/LocalShellExecAction.ts +11 -0
  97. package/src/app-server/protocol-generated/typescript/LocalShellStatus.ts +5 -0
  98. package/src/app-server/protocol-generated/typescript/MessagePhase.ts +11 -0
  99. package/src/app-server/protocol-generated/typescript/ModeKind.ts +8 -0
  100. package/src/app-server/protocol-generated/typescript/NetworkPolicyAmendment.ts +6 -0
  101. package/src/app-server/protocol-generated/typescript/NetworkPolicyRuleAction.ts +5 -0
  102. package/src/app-server/protocol-generated/typescript/ParsedCommand.ts +20 -0
  103. package/src/app-server/protocol-generated/typescript/Personality.ts +5 -0
  104. package/src/app-server/protocol-generated/typescript/PlanType.ts +17 -0
  105. package/src/app-server/protocol-generated/typescript/RealtimeConversationVersion.ts +5 -0
  106. package/src/app-server/protocol-generated/typescript/RealtimeOutputModality.ts +5 -0
  107. package/src/app-server/protocol-generated/typescript/RealtimeVoice.ts +24 -0
  108. package/src/app-server/protocol-generated/typescript/RealtimeVoicesList.ts +11 -0
  109. package/src/app-server/protocol-generated/typescript/ReasoningEffort.ts +8 -0
  110. package/src/app-server/protocol-generated/typescript/ReasoningItemContent.ts +7 -0
  111. package/src/app-server/protocol-generated/typescript/ReasoningItemReasoningSummary.ts +5 -0
  112. package/src/app-server/protocol-generated/typescript/ReasoningSummary.ts +10 -0
  113. package/src/app-server/protocol-generated/typescript/RequestId.ts +5 -0
  114. package/src/app-server/protocol-generated/typescript/Resource.ts +19 -0
  115. package/src/app-server/protocol-generated/typescript/ResourceContent.ts +27 -0
  116. package/src/app-server/protocol-generated/typescript/ResourceTemplate.ts +16 -0
  117. package/src/app-server/protocol-generated/typescript/ResponseItem.ts +70 -0
  118. package/src/app-server/protocol-generated/typescript/ReviewDecision.ts +17 -0
  119. package/src/app-server/protocol-generated/typescript/ServerNotification.ts +144 -0
  120. package/src/app-server/protocol-generated/typescript/ServerRequest.ts +47 -0
  121. package/src/app-server/protocol-generated/typescript/ServiceTier.ts +5 -0
  122. package/src/app-server/protocol-generated/typescript/SessionSource.ts +13 -0
  123. package/src/app-server/protocol-generated/typescript/Settings.ts +13 -0
  124. package/src/app-server/protocol-generated/typescript/SubAgentSource.ts +20 -0
  125. package/src/app-server/protocol-generated/typescript/ThreadId.ts +5 -0
  126. package/src/app-server/protocol-generated/typescript/ThreadMemoryMode.ts +5 -0
  127. package/src/app-server/protocol-generated/typescript/Tool.ts +18 -0
  128. package/src/app-server/protocol-generated/typescript/Verbosity.ts +9 -0
  129. package/src/app-server/protocol-generated/typescript/WebSearchAction.ts +9 -0
  130. package/src/app-server/protocol-generated/typescript/WebSearchContextSize.ts +5 -0
  131. package/src/app-server/protocol-generated/typescript/WebSearchLocation.ts +10 -0
  132. package/src/app-server/protocol-generated/typescript/WebSearchMode.ts +5 -0
  133. package/src/app-server/protocol-generated/typescript/WebSearchToolConfig.ts +11 -0
  134. package/src/app-server/protocol-generated/typescript/index.ts +80 -0
  135. package/src/app-server/protocol-generated/typescript/serde_json/JsonValue.ts +11 -0
  136. package/src/app-server/protocol-generated/typescript/v2/Account.ts +9 -0
  137. package/src/app-server/protocol-generated/typescript/v2/AccountLoginCompletedNotification.ts +9 -0
  138. package/src/app-server/protocol-generated/typescript/v2/AccountRateLimitsUpdatedNotification.ts +6 -0
  139. package/src/app-server/protocol-generated/typescript/v2/AccountUpdatedNotification.ts +7 -0
  140. package/src/app-server/protocol-generated/typescript/v2/AddCreditsNudgeCreditType.ts +5 -0
  141. package/src/app-server/protocol-generated/typescript/v2/AddCreditsNudgeEmailStatus.ts +5 -0
  142. package/src/app-server/protocol-generated/typescript/v2/AdditionalFileSystemPermissions.ts +18 -0
  143. package/src/app-server/protocol-generated/typescript/v2/AdditionalNetworkPermissions.ts +5 -0
  144. package/src/app-server/protocol-generated/typescript/v2/AdditionalPermissionProfile.ts +10 -0
  145. package/src/app-server/protocol-generated/typescript/v2/AgentMessageDeltaNotification.ts +10 -0
  146. package/src/app-server/protocol-generated/typescript/v2/AnalyticsConfig.ts +14 -0
  147. package/src/app-server/protocol-generated/typescript/v2/AppBranding.ts +15 -0
  148. package/src/app-server/protocol-generated/typescript/v2/AppInfo.ts +32 -0
  149. package/src/app-server/protocol-generated/typescript/v2/AppListUpdatedNotification.ts +9 -0
  150. package/src/app-server/protocol-generated/typescript/v2/AppMetadata.ts +20 -0
  151. package/src/app-server/protocol-generated/typescript/v2/AppReview.ts +5 -0
  152. package/src/app-server/protocol-generated/typescript/v2/AppScreenshot.ts +5 -0
  153. package/src/app-server/protocol-generated/typescript/v2/AppSummary.ts +14 -0
  154. package/src/app-server/protocol-generated/typescript/v2/AppToolApproval.ts +5 -0
  155. package/src/app-server/protocol-generated/typescript/v2/AppToolsConfig.ts +8 -0
  156. package/src/app-server/protocol-generated/typescript/v2/ApprovalsReviewer.ts +12 -0
  157. package/src/app-server/protocol-generated/typescript/v2/AppsConfig.ts +17 -0
  158. package/src/app-server/protocol-generated/typescript/v2/AppsDefaultConfig.ts +9 -0
  159. package/src/app-server/protocol-generated/typescript/v2/AppsListParams.ts +25 -0
  160. package/src/app-server/protocol-generated/typescript/v2/AppsListResponse.ts +16 -0
  161. package/src/app-server/protocol-generated/typescript/v2/AskForApproval.ts +18 -0
  162. package/src/app-server/protocol-generated/typescript/v2/AutoReviewDecisionSource.ts +8 -0
  163. package/src/app-server/protocol-generated/typescript/v2/ByteRange.ts +5 -0
  164. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountParams.ts +5 -0
  165. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountResponse.ts +6 -0
  166. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountStatus.ts +5 -0
  167. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshParams.ts +18 -0
  168. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshReason.ts +5 -0
  169. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshResponse.ts +9 -0
  170. package/src/app-server/protocol-generated/typescript/v2/CodexErrorInfo.ts +27 -0
  171. package/src/app-server/protocol-generated/typescript/v2/CollabAgentState.ts +6 -0
  172. package/src/app-server/protocol-generated/typescript/v2/CollabAgentStatus.ts +12 -0
  173. package/src/app-server/protocol-generated/typescript/v2/CollabAgentTool.ts +5 -0
  174. package/src/app-server/protocol-generated/typescript/v2/CollabAgentToolCallStatus.ts +5 -0
  175. package/src/app-server/protocol-generated/typescript/v2/CollaborationModeMask.ts +15 -0
  176. package/src/app-server/protocol-generated/typescript/v2/CommandAction.ts +10 -0
  177. package/src/app-server/protocol-generated/typescript/v2/CommandExecOutputDeltaNotification.ts +31 -0
  178. package/src/app-server/protocol-generated/typescript/v2/CommandExecOutputStream.ts +8 -0
  179. package/src/app-server/protocol-generated/typescript/v2/CommandExecParams.ts +107 -0
  180. package/src/app-server/protocol-generated/typescript/v2/CommandExecResizeParams.ts +19 -0
  181. package/src/app-server/protocol-generated/typescript/v2/CommandExecResizeResponse.ts +8 -0
  182. package/src/app-server/protocol-generated/typescript/v2/CommandExecResponse.ts +25 -0
  183. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminalSize.ts +17 -0
  184. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminateParams.ts +14 -0
  185. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminateResponse.ts +8 -0
  186. package/src/app-server/protocol-generated/typescript/v2/CommandExecWriteParams.ts +23 -0
  187. package/src/app-server/protocol-generated/typescript/v2/CommandExecWriteResponse.ts +8 -0
  188. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionApprovalDecision.ts +13 -0
  189. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionOutputDeltaNotification.ts +10 -0
  190. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionRequestApprovalParams.ts +62 -0
  191. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionRequestApprovalResponse.ts +8 -0
  192. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionSource.ts +9 -0
  193. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionStatus.ts +5 -0
  194. package/src/app-server/protocol-generated/typescript/v2/Config.ts +54 -0
  195. package/src/app-server/protocol-generated/typescript/v2/ConfigBatchWriteParams.ts +17 -0
  196. package/src/app-server/protocol-generated/typescript/v2/ConfigEdit.ts +7 -0
  197. package/src/app-server/protocol-generated/typescript/v2/ConfigLayer.ts +12 -0
  198. package/src/app-server/protocol-generated/typescript/v2/ConfigLayerMetadata.ts +6 -0
  199. package/src/app-server/protocol-generated/typescript/v2/ConfigLayerSource.ts +27 -0
  200. package/src/app-server/protocol-generated/typescript/v2/ConfigReadParams.ts +13 -0
  201. package/src/app-server/protocol-generated/typescript/v2/ConfigReadResponse.ts +12 -0
  202. package/src/app-server/protocol-generated/typescript/v2/ConfigRequirements.ts +15 -0
  203. package/src/app-server/protocol-generated/typescript/v2/ConfigRequirementsReadResponse.ts +11 -0
  204. package/src/app-server/protocol-generated/typescript/v2/ConfigValueWriteParams.ts +16 -0
  205. package/src/app-server/protocol-generated/typescript/v2/ConfigWarningNotification.ts +23 -0
  206. package/src/app-server/protocol-generated/typescript/v2/ConfigWriteResponse.ts +16 -0
  207. package/src/app-server/protocol-generated/typescript/v2/ConfiguredHookHandler.ts +14 -0
  208. package/src/app-server/protocol-generated/typescript/v2/ConfiguredHookMatcherGroup.ts +9 -0
  209. package/src/app-server/protocol-generated/typescript/v2/ContextCompactedNotification.ts +8 -0
  210. package/src/app-server/protocol-generated/typescript/v2/CreditsSnapshot.ts +5 -0
  211. package/src/app-server/protocol-generated/typescript/v2/DeprecationNoticeNotification.ts +14 -0
  212. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyAlgorithm.ts +8 -0
  213. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyCreateParams.ts +16 -0
  214. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyCreateResponse.ts +18 -0
  215. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyProtectionClass.ts +11 -0
  216. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyProtectionPolicy.ts +8 -0
  217. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyPublicParams.ts +8 -0
  218. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyPublicResponse.ts +18 -0
  219. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignParams.ts +9 -0
  220. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignPayload.ts +68 -0
  221. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignResponse.ts +20 -0
  222. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallOutputContentItem.ts +7 -0
  223. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallParams.ts +13 -0
  224. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallResponse.ts +9 -0
  225. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallStatus.ts +5 -0
  226. package/src/app-server/protocol-generated/typescript/v2/DynamicToolSpec.ts +12 -0
  227. package/src/app-server/protocol-generated/typescript/v2/ErrorNotification.ts +11 -0
  228. package/src/app-server/protocol-generated/typescript/v2/ExecPolicyAmendment.ts +5 -0
  229. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeature.ts +38 -0
  230. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureEnablementSetParams.ts +13 -0
  231. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureEnablementSetResponse.ts +10 -0
  232. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureListParams.ts +14 -0
  233. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureListResponse.ts +13 -0
  234. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureStage.ts +10 -0
  235. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigDetectParams.ts +14 -0
  236. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigDetectResponse.ts +6 -0
  237. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportCompletedNotification.ts +5 -0
  238. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportParams.ts +8 -0
  239. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportResponse.ts +5 -0
  240. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigMigrationItem.ts +15 -0
  241. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigMigrationItemType.ts +10 -0
  242. package/src/app-server/protocol-generated/typescript/v2/FeedbackUploadParams.ts +12 -0
  243. package/src/app-server/protocol-generated/typescript/v2/FeedbackUploadResponse.ts +5 -0
  244. package/src/app-server/protocol-generated/typescript/v2/FileChangeApprovalDecision.ts +5 -0
  245. package/src/app-server/protocol-generated/typescript/v2/FileChangeOutputDeltaNotification.ts +10 -0
  246. package/src/app-server/protocol-generated/typescript/v2/FileChangePatchUpdatedNotification.ts +11 -0
  247. package/src/app-server/protocol-generated/typescript/v2/FileChangeRequestApprovalParams.ts +18 -0
  248. package/src/app-server/protocol-generated/typescript/v2/FileChangeRequestApprovalResponse.ts +6 -0
  249. package/src/app-server/protocol-generated/typescript/v2/FileSystemAccessMode.ts +5 -0
  250. package/src/app-server/protocol-generated/typescript/v2/FileSystemPath.ts +10 -0
  251. package/src/app-server/protocol-generated/typescript/v2/FileSystemSandboxEntry.ts +7 -0
  252. package/src/app-server/protocol-generated/typescript/v2/FileSystemSpecialPath.ts +12 -0
  253. package/src/app-server/protocol-generated/typescript/v2/FileUpdateChange.ts +6 -0
  254. package/src/app-server/protocol-generated/typescript/v2/FsChangedNotification.ts +18 -0
  255. package/src/app-server/protocol-generated/typescript/v2/FsCopyParams.ts +22 -0
  256. package/src/app-server/protocol-generated/typescript/v2/FsCopyResponse.ts +8 -0
  257. package/src/app-server/protocol-generated/typescript/v2/FsCreateDirectoryParams.ts +18 -0
  258. package/src/app-server/protocol-generated/typescript/v2/FsCreateDirectoryResponse.ts +8 -0
  259. package/src/app-server/protocol-generated/typescript/v2/FsGetMetadataParams.ts +14 -0
  260. package/src/app-server/protocol-generated/typescript/v2/FsGetMetadataResponse.ts +29 -0
  261. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryEntry.ts +21 -0
  262. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryParams.ts +14 -0
  263. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryResponse.ts +14 -0
  264. package/src/app-server/protocol-generated/typescript/v2/FsReadFileParams.ts +14 -0
  265. package/src/app-server/protocol-generated/typescript/v2/FsReadFileResponse.ts +13 -0
  266. package/src/app-server/protocol-generated/typescript/v2/FsRemoveParams.ts +22 -0
  267. package/src/app-server/protocol-generated/typescript/v2/FsRemoveResponse.ts +8 -0
  268. package/src/app-server/protocol-generated/typescript/v2/FsUnwatchParams.ts +13 -0
  269. package/src/app-server/protocol-generated/typescript/v2/FsUnwatchResponse.ts +8 -0
  270. package/src/app-server/protocol-generated/typescript/v2/FsWatchParams.ts +18 -0
  271. package/src/app-server/protocol-generated/typescript/v2/FsWatchResponse.ts +14 -0
  272. package/src/app-server/protocol-generated/typescript/v2/FsWriteFileParams.ts +18 -0
  273. package/src/app-server/protocol-generated/typescript/v2/FsWriteFileResponse.ts +8 -0
  274. package/src/app-server/protocol-generated/typescript/v2/GetAccountParams.ts +14 -0
  275. package/src/app-server/protocol-generated/typescript/v2/GetAccountRateLimitsResponse.ts +15 -0
  276. package/src/app-server/protocol-generated/typescript/v2/GetAccountResponse.ts +6 -0
  277. package/src/app-server/protocol-generated/typescript/v2/GitInfo.ts +5 -0
  278. package/src/app-server/protocol-generated/typescript/v2/GrantedPermissionProfile.ts +10 -0
  279. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReview.ts +18 -0
  280. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReviewAction.ts +34 -0
  281. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReviewStatus.ts +13 -0
  282. package/src/app-server/protocol-generated/typescript/v2/GuardianCommandSource.ts +5 -0
  283. package/src/app-server/protocol-generated/typescript/v2/GuardianRiskLevel.ts +8 -0
  284. package/src/app-server/protocol-generated/typescript/v2/GuardianUserAuthorization.ts +8 -0
  285. package/src/app-server/protocol-generated/typescript/v2/GuardianWarningNotification.ts +14 -0
  286. package/src/app-server/protocol-generated/typescript/v2/HookCompletedNotification.ts +10 -0
  287. package/src/app-server/protocol-generated/typescript/v2/HookEventName.ts +11 -0
  288. package/src/app-server/protocol-generated/typescript/v2/HookExecutionMode.ts +5 -0
  289. package/src/app-server/protocol-generated/typescript/v2/HookHandlerType.ts +5 -0
  290. package/src/app-server/protocol-generated/typescript/v2/HookOutputEntry.ts +6 -0
  291. package/src/app-server/protocol-generated/typescript/v2/HookOutputEntryKind.ts +5 -0
  292. package/src/app-server/protocol-generated/typescript/v2/HookPromptFragment.ts +5 -0
  293. package/src/app-server/protocol-generated/typescript/v2/HookRunStatus.ts +5 -0
  294. package/src/app-server/protocol-generated/typescript/v2/HookRunSummary.ts +28 -0
  295. package/src/app-server/protocol-generated/typescript/v2/HookScope.ts +5 -0
  296. package/src/app-server/protocol-generated/typescript/v2/HookSource.ts +13 -0
  297. package/src/app-server/protocol-generated/typescript/v2/HookStartedNotification.ts +10 -0
  298. package/src/app-server/protocol-generated/typescript/v2/ItemCompletedNotification.ts +6 -0
  299. package/src/app-server/protocol-generated/typescript/v2/ItemGuardianApprovalReviewCompletedNotification.ts +36 -0
  300. package/src/app-server/protocol-generated/typescript/v2/ItemGuardianApprovalReviewStartedNotification.ts +34 -0
  301. package/src/app-server/protocol-generated/typescript/v2/ItemStartedNotification.ts +6 -0
  302. package/src/app-server/protocol-generated/typescript/v2/ListMcpServerStatusParams.ts +20 -0
  303. package/src/app-server/protocol-generated/typescript/v2/ListMcpServerStatusResponse.ts +13 -0
  304. package/src/app-server/protocol-generated/typescript/v2/LoginAccountParams.ts +27 -0
  305. package/src/app-server/protocol-generated/typescript/v2/LoginAccountResponse.ts +27 -0
  306. package/src/app-server/protocol-generated/typescript/v2/LogoutAccountResponse.ts +5 -0
  307. package/src/app-server/protocol-generated/typescript/v2/ManagedHooksRequirements.ts +15 -0
  308. package/src/app-server/protocol-generated/typescript/v2/MarketplaceAddParams.ts +9 -0
  309. package/src/app-server/protocol-generated/typescript/v2/MarketplaceAddResponse.ts +10 -0
  310. package/src/app-server/protocol-generated/typescript/v2/MarketplaceInterface.ts +5 -0
  311. package/src/app-server/protocol-generated/typescript/v2/MarketplaceLoadErrorInfo.ts +6 -0
  312. package/src/app-server/protocol-generated/typescript/v2/MarketplaceRemoveParams.ts +5 -0
  313. package/src/app-server/protocol-generated/typescript/v2/MarketplaceRemoveResponse.ts +9 -0
  314. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeErrorInfo.ts +5 -0
  315. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeParams.ts +5 -0
  316. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeResponse.ts +11 -0
  317. package/src/app-server/protocol-generated/typescript/v2/McpAuthStatus.ts +5 -0
  318. package/src/app-server/protocol-generated/typescript/v2/McpElicitationArrayType.ts +5 -0
  319. package/src/app-server/protocol-generated/typescript/v2/McpElicitationBooleanSchema.ts +11 -0
  320. package/src/app-server/protocol-generated/typescript/v2/McpElicitationBooleanType.ts +5 -0
  321. package/src/app-server/protocol-generated/typescript/v2/McpElicitationConstOption.ts +5 -0
  322. package/src/app-server/protocol-generated/typescript/v2/McpElicitationEnumSchema.ts +11 -0
  323. package/src/app-server/protocol-generated/typescript/v2/McpElicitationLegacyTitledEnumSchema.ts +13 -0
  324. package/src/app-server/protocol-generated/typescript/v2/McpElicitationMultiSelectEnumSchema.ts +9 -0
  325. package/src/app-server/protocol-generated/typescript/v2/McpElicitationNumberSchema.ts +13 -0
  326. package/src/app-server/protocol-generated/typescript/v2/McpElicitationNumberType.ts +5 -0
  327. package/src/app-server/protocol-generated/typescript/v2/McpElicitationObjectType.ts +5 -0
  328. package/src/app-server/protocol-generated/typescript/v2/McpElicitationPrimitiveSchema.ts +13 -0
  329. package/src/app-server/protocol-generated/typescript/v2/McpElicitationSchema.ts +18 -0
  330. package/src/app-server/protocol-generated/typescript/v2/McpElicitationSingleSelectEnumSchema.ts +9 -0
  331. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringFormat.ts +5 -0
  332. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringSchema.ts +15 -0
  333. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringType.ts +5 -0
  334. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledEnumItems.ts +6 -0
  335. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledMultiSelectEnumSchema.ts +15 -0
  336. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledSingleSelectEnumSchema.ts +13 -0
  337. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledEnumItems.ts +9 -0
  338. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledMultiSelectEnumSchema.ts +15 -0
  339. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledSingleSelectEnumSchema.ts +12 -0
  340. package/src/app-server/protocol-generated/typescript/v2/McpResourceReadParams.ts +5 -0
  341. package/src/app-server/protocol-generated/typescript/v2/McpResourceReadResponse.ts +6 -0
  342. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationAction.ts +5 -0
  343. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationRequestParams.ts +27 -0
  344. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationRequestResponse.ts +19 -0
  345. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginCompletedNotification.ts +9 -0
  346. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginParams.ts +9 -0
  347. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginResponse.ts +5 -0
  348. package/src/app-server/protocol-generated/typescript/v2/McpServerRefreshResponse.ts +5 -0
  349. package/src/app-server/protocol-generated/typescript/v2/McpServerStartupState.ts +5 -0
  350. package/src/app-server/protocol-generated/typescript/v2/McpServerStatus.ts +15 -0
  351. package/src/app-server/protocol-generated/typescript/v2/McpServerStatusDetail.ts +5 -0
  352. package/src/app-server/protocol-generated/typescript/v2/McpServerStatusUpdatedNotification.ts +10 -0
  353. package/src/app-server/protocol-generated/typescript/v2/McpServerToolCallParams.ts +12 -0
  354. package/src/app-server/protocol-generated/typescript/v2/McpServerToolCallResponse.ts +11 -0
  355. package/src/app-server/protocol-generated/typescript/v2/McpToolCallError.ts +5 -0
  356. package/src/app-server/protocol-generated/typescript/v2/McpToolCallProgressNotification.ts +10 -0
  357. package/src/app-server/protocol-generated/typescript/v2/McpToolCallResult.ts +10 -0
  358. package/src/app-server/protocol-generated/typescript/v2/McpToolCallStatus.ts +5 -0
  359. package/src/app-server/protocol-generated/typescript/v2/MemoryCitation.ts +6 -0
  360. package/src/app-server/protocol-generated/typescript/v2/MemoryCitationEntry.ts +10 -0
  361. package/src/app-server/protocol-generated/typescript/v2/MergeStrategy.ts +5 -0
  362. package/src/app-server/protocol-generated/typescript/v2/MigrationDetails.ts +6 -0
  363. package/src/app-server/protocol-generated/typescript/v2/Model.ts +25 -0
  364. package/src/app-server/protocol-generated/typescript/v2/ModelAvailabilityNux.ts +5 -0
  365. package/src/app-server/protocol-generated/typescript/v2/ModelListParams.ts +18 -0
  366. package/src/app-server/protocol-generated/typescript/v2/ModelListResponse.ts +13 -0
  367. package/src/app-server/protocol-generated/typescript/v2/ModelRerouteReason.ts +5 -0
  368. package/src/app-server/protocol-generated/typescript/v2/ModelReroutedNotification.ts +12 -0
  369. package/src/app-server/protocol-generated/typescript/v2/ModelUpgradeInfo.ts +10 -0
  370. package/src/app-server/protocol-generated/typescript/v2/ModelVerification.ts +5 -0
  371. package/src/app-server/protocol-generated/typescript/v2/ModelVerificationNotification.ts +10 -0
  372. package/src/app-server/protocol-generated/typescript/v2/NetworkAccess.ts +5 -0
  373. package/src/app-server/protocol-generated/typescript/v2/NetworkApprovalContext.ts +6 -0
  374. package/src/app-server/protocol-generated/typescript/v2/NetworkApprovalProtocol.ts +5 -0
  375. package/src/app-server/protocol-generated/typescript/v2/NetworkDomainPermission.ts +5 -0
  376. package/src/app-server/protocol-generated/typescript/v2/NetworkPolicyAmendment.ts +6 -0
  377. package/src/app-server/protocol-generated/typescript/v2/NetworkPolicyRuleAction.ts +5 -0
  378. package/src/app-server/protocol-generated/typescript/v2/NetworkRequirements.ts +40 -0
  379. package/src/app-server/protocol-generated/typescript/v2/NetworkUnixSocketPermission.ts +5 -0
  380. package/src/app-server/protocol-generated/typescript/v2/NonSteerableTurnKind.ts +5 -0
  381. package/src/app-server/protocol-generated/typescript/v2/OverriddenMetadata.ts +11 -0
  382. package/src/app-server/protocol-generated/typescript/v2/PatchApplyStatus.ts +5 -0
  383. package/src/app-server/protocol-generated/typescript/v2/PatchChangeKind.ts +8 -0
  384. package/src/app-server/protocol-generated/typescript/v2/PermissionGrantScope.ts +5 -0
  385. package/src/app-server/protocol-generated/typescript/v2/PermissionProfile.ts +10 -0
  386. package/src/app-server/protocol-generated/typescript/v2/PermissionProfileFileSystemPermissions.ts +9 -0
  387. package/src/app-server/protocol-generated/typescript/v2/PermissionProfileNetworkPermissions.ts +5 -0
  388. package/src/app-server/protocol-generated/typescript/v2/PermissionsRequestApprovalParams.ts +14 -0
  389. package/src/app-server/protocol-generated/typescript/v2/PermissionsRequestApprovalResponse.ts +14 -0
  390. package/src/app-server/protocol-generated/typescript/v2/PlanDeltaNotification.ts +14 -0
  391. package/src/app-server/protocol-generated/typescript/v2/PluginAuthPolicy.ts +5 -0
  392. package/src/app-server/protocol-generated/typescript/v2/PluginDetail.ts +17 -0
  393. package/src/app-server/protocol-generated/typescript/v2/PluginInstallParams.ts +10 -0
  394. package/src/app-server/protocol-generated/typescript/v2/PluginInstallPolicy.ts +5 -0
  395. package/src/app-server/protocol-generated/typescript/v2/PluginInstallResponse.ts +10 -0
  396. package/src/app-server/protocol-generated/typescript/v2/PluginInterface.ts +46 -0
  397. package/src/app-server/protocol-generated/typescript/v2/PluginListParams.ts +12 -0
  398. package/src/app-server/protocol-generated/typescript/v2/PluginListResponse.ts +11 -0
  399. package/src/app-server/protocol-generated/typescript/v2/PluginMarketplaceEntry.ts +17 -0
  400. package/src/app-server/protocol-generated/typescript/v2/PluginReadParams.ts +10 -0
  401. package/src/app-server/protocol-generated/typescript/v2/PluginReadResponse.ts +6 -0
  402. package/src/app-server/protocol-generated/typescript/v2/PluginSource.ts +9 -0
  403. package/src/app-server/protocol-generated/typescript/v2/PluginSummary.ts +18 -0
  404. package/src/app-server/protocol-generated/typescript/v2/PluginUninstallParams.ts +5 -0
  405. package/src/app-server/protocol-generated/typescript/v2/PluginUninstallResponse.ts +5 -0
  406. package/src/app-server/protocol-generated/typescript/v2/PluginsMigration.ts +5 -0
  407. package/src/app-server/protocol-generated/typescript/v2/ProfileV2.ts +38 -0
  408. package/src/app-server/protocol-generated/typescript/v2/RateLimitReachedType.ts +10 -0
  409. package/src/app-server/protocol-generated/typescript/v2/RateLimitSnapshot.ts +17 -0
  410. package/src/app-server/protocol-generated/typescript/v2/RateLimitWindow.ts +9 -0
  411. package/src/app-server/protocol-generated/typescript/v2/RawResponseItemCompletedNotification.ts +10 -0
  412. package/src/app-server/protocol-generated/typescript/v2/ReadOnlyAccess.ts +8 -0
  413. package/src/app-server/protocol-generated/typescript/v2/ReasoningEffortOption.ts +6 -0
  414. package/src/app-server/protocol-generated/typescript/v2/ReasoningSummaryPartAddedNotification.ts +10 -0
  415. package/src/app-server/protocol-generated/typescript/v2/ReasoningSummaryTextDeltaNotification.ts +11 -0
  416. package/src/app-server/protocol-generated/typescript/v2/ReasoningTextDeltaNotification.ts +11 -0
  417. package/src/app-server/protocol-generated/typescript/v2/RemoteControlClientConnectionAudience.ts +8 -0
  418. package/src/app-server/protocol-generated/typescript/v2/RemoteControlClientEnrollmentAudience.ts +8 -0
  419. package/src/app-server/protocol-generated/typescript/v2/RequestPermissionProfile.ts +10 -0
  420. package/src/app-server/protocol-generated/typescript/v2/ResidencyRequirement.ts +5 -0
  421. package/src/app-server/protocol-generated/typescript/v2/ReviewDelivery.ts +5 -0
  422. package/src/app-server/protocol-generated/typescript/v2/ReviewStartParams.ts +15 -0
  423. package/src/app-server/protocol-generated/typescript/v2/ReviewStartResponse.ts +15 -0
  424. package/src/app-server/protocol-generated/typescript/v2/ReviewTarget.ts +16 -0
  425. package/src/app-server/protocol-generated/typescript/v2/SandboxMode.ts +5 -0
  426. package/src/app-server/protocol-generated/typescript/v2/SandboxPolicy.ts +19 -0
  427. package/src/app-server/protocol-generated/typescript/v2/SandboxWorkspaceWrite.ts +10 -0
  428. package/src/app-server/protocol-generated/typescript/v2/SendAddCreditsNudgeEmailParams.ts +6 -0
  429. package/src/app-server/protocol-generated/typescript/v2/SendAddCreditsNudgeEmailResponse.ts +6 -0
  430. package/src/app-server/protocol-generated/typescript/v2/ServerRequestResolvedNotification.ts +6 -0
  431. package/src/app-server/protocol-generated/typescript/v2/SessionSource.ts +13 -0
  432. package/src/app-server/protocol-generated/typescript/v2/SkillDependencies.ts +6 -0
  433. package/src/app-server/protocol-generated/typescript/v2/SkillErrorInfo.ts +5 -0
  434. package/src/app-server/protocol-generated/typescript/v2/SkillInterface.ts +13 -0
  435. package/src/app-server/protocol-generated/typescript/v2/SkillMetadata.ts +21 -0
  436. package/src/app-server/protocol-generated/typescript/v2/SkillScope.ts +5 -0
  437. package/src/app-server/protocol-generated/typescript/v2/SkillSummary.ts +14 -0
  438. package/src/app-server/protocol-generated/typescript/v2/SkillToolDependency.ts +12 -0
  439. package/src/app-server/protocol-generated/typescript/v2/SkillsChangedNotification.ts +11 -0
  440. package/src/app-server/protocol-generated/typescript/v2/SkillsConfigWriteParams.ts +16 -0
  441. package/src/app-server/protocol-generated/typescript/v2/SkillsConfigWriteResponse.ts +5 -0
  442. package/src/app-server/protocol-generated/typescript/v2/SkillsListEntry.ts +11 -0
  443. package/src/app-server/protocol-generated/typescript/v2/SkillsListExtraRootsForCwd.ts +5 -0
  444. package/src/app-server/protocol-generated/typescript/v2/SkillsListParams.ts +19 -0
  445. package/src/app-server/protocol-generated/typescript/v2/SkillsListResponse.ts +6 -0
  446. package/src/app-server/protocol-generated/typescript/v2/SortDirection.ts +5 -0
  447. package/src/app-server/protocol-generated/typescript/v2/TerminalInteractionNotification.ts +11 -0
  448. package/src/app-server/protocol-generated/typescript/v2/TextElement.ts +15 -0
  449. package/src/app-server/protocol-generated/typescript/v2/TextPosition.ts +14 -0
  450. package/src/app-server/protocol-generated/typescript/v2/TextRange.ts +6 -0
  451. package/src/app-server/protocol-generated/typescript/v2/Thread.ts +79 -0
  452. package/src/app-server/protocol-generated/typescript/v2/ThreadActiveFlag.ts +5 -0
  453. package/src/app-server/protocol-generated/typescript/v2/ThreadApproveGuardianDeniedActionParams.ts +12 -0
  454. package/src/app-server/protocol-generated/typescript/v2/ThreadApproveGuardianDeniedActionResponse.ts +5 -0
  455. package/src/app-server/protocol-generated/typescript/v2/ThreadArchiveParams.ts +5 -0
  456. package/src/app-server/protocol-generated/typescript/v2/ThreadArchiveResponse.ts +5 -0
  457. package/src/app-server/protocol-generated/typescript/v2/ThreadArchivedNotification.ts +5 -0
  458. package/src/app-server/protocol-generated/typescript/v2/ThreadClosedNotification.ts +5 -0
  459. package/src/app-server/protocol-generated/typescript/v2/ThreadCompactStartParams.ts +5 -0
  460. package/src/app-server/protocol-generated/typescript/v2/ThreadCompactStartResponse.ts +5 -0
  461. package/src/app-server/protocol-generated/typescript/v2/ThreadForkParams.ts +55 -0
  462. package/src/app-server/protocol-generated/typescript/v2/ThreadForkResponse.ts +41 -0
  463. package/src/app-server/protocol-generated/typescript/v2/ThreadInjectItemsParams.ts +12 -0
  464. package/src/app-server/protocol-generated/typescript/v2/ThreadInjectItemsResponse.ts +5 -0
  465. package/src/app-server/protocol-generated/typescript/v2/ThreadItem.ts +156 -0
  466. package/src/app-server/protocol-generated/typescript/v2/ThreadListParams.ts +55 -0
  467. package/src/app-server/protocol-generated/typescript/v2/ThreadListResponse.ts +20 -0
  468. package/src/app-server/protocol-generated/typescript/v2/ThreadLoadedListParams.ts +14 -0
  469. package/src/app-server/protocol-generated/typescript/v2/ThreadLoadedListResponse.ts +15 -0
  470. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataGitInfoUpdateParams.ts +21 -0
  471. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataUpdateParams.ts +14 -0
  472. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataUpdateResponse.ts +6 -0
  473. package/src/app-server/protocol-generated/typescript/v2/ThreadNameUpdatedNotification.ts +5 -0
  474. package/src/app-server/protocol-generated/typescript/v2/ThreadReadParams.ts +11 -0
  475. package/src/app-server/protocol-generated/typescript/v2/ThreadReadResponse.ts +6 -0
  476. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeAudioChunk.ts +14 -0
  477. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeClosedNotification.ts +8 -0
  478. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeErrorNotification.ts +8 -0
  479. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeItemAddedNotification.ts +9 -0
  480. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeOutputAudioDeltaNotification.ts +12 -0
  481. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeSdpNotification.ts +8 -0
  482. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeStartTransport.ts +17 -0
  483. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeStartedNotification.ts +13 -0
  484. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeTranscriptDeltaNotification.ts +16 -0
  485. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeTranscriptDoneNotification.ts +16 -0
  486. package/src/app-server/protocol-generated/typescript/v2/ThreadResumeParams.ts +64 -0
  487. package/src/app-server/protocol-generated/typescript/v2/ThreadResumeResponse.ts +41 -0
  488. package/src/app-server/protocol-generated/typescript/v2/ThreadRollbackParams.ts +14 -0
  489. package/src/app-server/protocol-generated/typescript/v2/ThreadRollbackResponse.ts +15 -0
  490. package/src/app-server/protocol-generated/typescript/v2/ThreadSetNameParams.ts +5 -0
  491. package/src/app-server/protocol-generated/typescript/v2/ThreadSetNameResponse.ts +5 -0
  492. package/src/app-server/protocol-generated/typescript/v2/ThreadShellCommandParams.ts +14 -0
  493. package/src/app-server/protocol-generated/typescript/v2/ThreadShellCommandResponse.ts +5 -0
  494. package/src/app-server/protocol-generated/typescript/v2/ThreadSortKey.ts +5 -0
  495. package/src/app-server/protocol-generated/typescript/v2/ThreadSourceKind.ts +15 -0
  496. package/src/app-server/protocol-generated/typescript/v2/ThreadStartParams.ts +43 -0
  497. package/src/app-server/protocol-generated/typescript/v2/ThreadStartResponse.ts +41 -0
  498. package/src/app-server/protocol-generated/typescript/v2/ThreadStartSource.ts +5 -0
  499. package/src/app-server/protocol-generated/typescript/v2/ThreadStartedNotification.ts +6 -0
  500. package/src/app-server/protocol-generated/typescript/v2/ThreadStatus.ts +10 -0
  501. package/src/app-server/protocol-generated/typescript/v2/ThreadStatusChangedNotification.ts +6 -0
  502. package/src/app-server/protocol-generated/typescript/v2/ThreadTokenUsage.ts +10 -0
  503. package/src/app-server/protocol-generated/typescript/v2/ThreadTokenUsageUpdatedNotification.ts +10 -0
  504. package/src/app-server/protocol-generated/typescript/v2/ThreadTurnsListParams.ts +20 -0
  505. package/src/app-server/protocol-generated/typescript/v2/ThreadTurnsListResponse.ts +20 -0
  506. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchiveParams.ts +5 -0
  507. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchiveResponse.ts +6 -0
  508. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchivedNotification.ts +5 -0
  509. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeParams.ts +5 -0
  510. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeResponse.ts +6 -0
  511. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeStatus.ts +5 -0
  512. package/src/app-server/protocol-generated/typescript/v2/TokenUsageBreakdown.ts +11 -0
  513. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputAnswer.ts +8 -0
  514. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputOption.ts +8 -0
  515. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputParams.ts +14 -0
  516. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputQuestion.ts +16 -0
  517. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputResponse.ts +11 -0
  518. package/src/app-server/protocol-generated/typescript/v2/ToolsV2.ts +6 -0
  519. package/src/app-server/protocol-generated/typescript/v2/Turn.ts +33 -0
  520. package/src/app-server/protocol-generated/typescript/v2/TurnCompletedNotification.ts +6 -0
  521. package/src/app-server/protocol-generated/typescript/v2/TurnDiffUpdatedNotification.ts +9 -0
  522. package/src/app-server/protocol-generated/typescript/v2/TurnEnvironmentParams.ts +6 -0
  523. package/src/app-server/protocol-generated/typescript/v2/TurnError.ts +10 -0
  524. package/src/app-server/protocol-generated/typescript/v2/TurnInterruptParams.ts +5 -0
  525. package/src/app-server/protocol-generated/typescript/v2/TurnInterruptResponse.ts +5 -0
  526. package/src/app-server/protocol-generated/typescript/v2/TurnPlanStep.ts +6 -0
  527. package/src/app-server/protocol-generated/typescript/v2/TurnPlanStepStatus.ts +5 -0
  528. package/src/app-server/protocol-generated/typescript/v2/TurnPlanUpdatedNotification.ts +11 -0
  529. package/src/app-server/protocol-generated/typescript/v2/TurnStartParams.ts +62 -0
  530. package/src/app-server/protocol-generated/typescript/v2/TurnStartResponse.ts +6 -0
  531. package/src/app-server/protocol-generated/typescript/v2/TurnStartedNotification.ts +6 -0
  532. package/src/app-server/protocol-generated/typescript/v2/TurnStatus.ts +5 -0
  533. package/src/app-server/protocol-generated/typescript/v2/TurnSteerParams.ts +13 -0
  534. package/src/app-server/protocol-generated/typescript/v2/TurnSteerResponse.ts +5 -0
  535. package/src/app-server/protocol-generated/typescript/v2/UserInput.ts +18 -0
  536. package/src/app-server/protocol-generated/typescript/v2/WarningNotification.ts +14 -0
  537. package/src/app-server/protocol-generated/typescript/v2/WebSearchAction.ts +9 -0
  538. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupCompletedNotification.ts +10 -0
  539. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupMode.ts +5 -0
  540. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupStartParams.ts +10 -0
  541. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupStartResponse.ts +5 -0
  542. package/src/app-server/protocol-generated/typescript/v2/WindowsWorldWritableWarningNotification.ts +9 -0
  543. package/src/app-server/protocol-generated/typescript/v2/WriteStatus.ts +5 -0
  544. package/src/app-server/protocol-generated/typescript/v2/index.ts +410 -0
  545. package/src/app-server/protocol-validators.ts +167 -0
  546. package/src/app-server/protocol.ts +110 -0
  547. package/src/app-server/request.ts +45 -0
  548. package/src/app-server/run-attempt.context-engine.test.ts +420 -0
  549. package/src/app-server/run-attempt.test.ts +2225 -0
  550. package/src/app-server/run-attempt.ts +1641 -0
  551. package/src/app-server/run-attempt.vision-tools.test.ts +35 -0
  552. package/src/app-server/schema-normalization-runtime-contract.test.ts +168 -0
  553. package/src/app-server/session-binding.test.ts +52 -0
  554. package/src/app-server/session-binding.ts +131 -0
  555. package/src/app-server/session-history.ts +44 -0
  556. package/src/app-server/shared-client.test.ts +368 -0
  557. package/src/app-server/shared-client.ts +157 -0
  558. package/src/app-server/test-support.ts +48 -0
  559. package/src/app-server/thread-lifecycle.test.ts +59 -0
  560. package/src/app-server/thread-lifecycle.ts +311 -0
  561. package/src/app-server/timeout.ts +22 -0
  562. package/src/app-server/trajectory.test.ts +155 -0
  563. package/src/app-server/trajectory.ts +433 -0
  564. package/src/app-server/transcript-mirror.test.ts +265 -0
  565. package/src/app-server/transcript-mirror.ts +308 -0
  566. package/src/app-server/transcript-repair-runtime-contract.test.ts +44 -0
  567. package/src/app-server/transport-stdio.test.ts +171 -0
  568. package/src/app-server/transport-stdio.ts +107 -0
  569. package/src/app-server/transport-websocket.test.ts +71 -0
  570. package/src/app-server/transport-websocket.ts +90 -0
  571. package/src/app-server/transport.ts +117 -0
  572. package/src/app-server/user-input-bridge.test.ts +137 -0
  573. package/src/app-server/user-input-bridge.ts +294 -0
  574. package/src/app-server/version.ts +3 -0
  575. package/src/app-server/vision-tools.ts +12 -0
  576. package/src/command-formatters.ts +204 -0
  577. package/src/command-handlers.ts +1559 -0
  578. package/src/command-rpc.test.ts +16 -0
  579. package/src/command-rpc.ts +97 -0
  580. package/src/commands.test.ts +1716 -0
  581. package/src/commands.ts +32 -0
  582. package/src/conversation-binding-data.ts +72 -0
  583. package/src/conversation-binding.test.ts +76 -0
  584. package/src/conversation-binding.ts +351 -0
  585. package/src/conversation-control.test.ts +50 -0
  586. package/src/conversation-control.ts +255 -0
  587. package/src/conversation-turn-collector.test.ts +154 -0
  588. package/src/conversation-turn-collector.ts +158 -0
  589. package/src/conversation-turn-input.test.ts +44 -0
  590. package/src/conversation-turn-input.ts +80 -0
  591. package/src/manifest.test.ts +20 -0
  592. package/src/migration/apply.ts +43 -0
  593. package/src/migration/helpers.ts +60 -0
  594. package/src/migration/plan.ts +148 -0
  595. package/src/migration/provider.test.ts +219 -0
  596. package/src/migration/provider.ts +28 -0
  597. package/src/migration/source.ts +176 -0
  598. package/src/migration/targets.ts +25 -0
  599. package/tsconfig.json +16 -0
@@ -0,0 +1,1641 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import { SessionManager } from "@mariozechner/pi-coding-agent";
4
+ import {
5
+ assembleHarnessContextEngine,
6
+ bootstrapHarnessContextEngine,
7
+ buildHarnessContextEngineRuntimeContext,
8
+ buildHarnessContextEngineRuntimeContextFromUsage,
9
+ buildEmbeddedAttemptToolRunContext,
10
+ clearActiveEmbeddedRun,
11
+ embeddedAgentLog,
12
+ emitAgentEvent as emitGlobalAgentEvent,
13
+ finalizeHarnessContextEngineTurn,
14
+ formatErrorMessage,
15
+ isActiveHarnessContextEngine,
16
+ isSubagentSessionKey,
17
+ normalizeAgentRuntimeTools,
18
+ resolveAttemptSpawnWorkspaceDir,
19
+ resolveAgentHarnessBeforePromptBuildResult,
20
+ resolveModelAuthMode,
21
+ resolveOpenClawAgentDir,
22
+ resolveSandboxContext,
23
+ resolveSessionAgentIds,
24
+ resolveUserPath,
25
+ runAgentHarnessAgentEndHook,
26
+ runAgentHarnessLlmInputHook,
27
+ runAgentHarnessLlmOutputHook,
28
+ runHarnessContextEngineMaintenance,
29
+ registerNativeHookRelay,
30
+ setActiveEmbeddedRun,
31
+ supportsModelTools,
32
+ runAgentCleanupStep,
33
+ type AgentMessage,
34
+ type EmbeddedRunAttemptParams,
35
+ type EmbeddedRunAttemptResult,
36
+ type NativeHookRelayEvent,
37
+ type NativeHookRelayRegistrationHandle,
38
+ } from "openclaw/plugin-sdk/agent-harness-runtime";
39
+ import { emitTrustedDiagnosticEvent } from "openclaw/plugin-sdk/diagnostic-runtime";
40
+ import { handleCodexAppServerApprovalRequest } from "./approval-bridge.js";
41
+ import { refreshCodexAppServerAuthTokens } from "./auth-bridge.js";
42
+ import {
43
+ createCodexAppServerClientFactoryTestHooks,
44
+ defaultCodexAppServerClientFactory,
45
+ } from "./client-factory.js";
46
+ import { isCodexAppServerApprovalRequest, type CodexAppServerClient } from "./client.js";
47
+ import { ensureCodexComputerUse } from "./computer-use.js";
48
+ import {
49
+ readCodexPluginConfig,
50
+ resolveCodexAppServerRuntimeOptions,
51
+ type CodexPluginConfig,
52
+ } from "./config.js";
53
+ import { projectContextEngineAssemblyForCodex } from "./context-engine-projection.js";
54
+ import { createCodexDynamicToolBridge, type CodexDynamicToolBridge } from "./dynamic-tools.js";
55
+ import { handleCodexAppServerElicitationRequest } from "./elicitation-bridge.js";
56
+ import { CodexAppServerEventProjector } from "./event-projector.js";
57
+ import {
58
+ buildCodexNativeHookRelayDisabledConfig,
59
+ buildCodexNativeHookRelayConfig,
60
+ CODEX_NATIVE_HOOK_RELAY_EVENTS,
61
+ } from "./native-hook-relay.js";
62
+ import {
63
+ assertCodexTurnStartResponse,
64
+ readCodexDynamicToolCallParams,
65
+ } from "./protocol-validators.js";
66
+ import {
67
+ type CodexUserInput,
68
+ isJsonObject,
69
+ type CodexServerNotification,
70
+ type CodexDynamicToolCallParams,
71
+ type CodexDynamicToolCallResponse,
72
+ type CodexTurnStartResponse,
73
+ type JsonObject,
74
+ type JsonValue,
75
+ } from "./protocol.js";
76
+ import { readCodexAppServerBinding, type CodexAppServerThreadBinding } from "./session-binding.js";
77
+ import { readCodexMirroredSessionHistoryMessages } from "./session-history.js";
78
+ import { clearSharedCodexAppServerClient } from "./shared-client.js";
79
+ import {
80
+ buildDeveloperInstructions,
81
+ buildTurnStartParams,
82
+ startOrResumeThread,
83
+ } from "./thread-lifecycle.js";
84
+ import {
85
+ createCodexTrajectoryRecorder,
86
+ normalizeCodexTrajectoryError,
87
+ recordCodexTrajectoryCompletion,
88
+ recordCodexTrajectoryContext,
89
+ } from "./trajectory.js";
90
+ import { mirrorCodexAppServerTranscript } from "./transcript-mirror.js";
91
+ import { createCodexUserInputBridge } from "./user-input-bridge.js";
92
+ import { filterToolsForVisionInputs } from "./vision-tools.js";
93
+
94
+ const CODEX_DYNAMIC_TOOL_TIMEOUT_MS = 30_000;
95
+ const CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS = 60_000;
96
+ const CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS = 30 * 60_000;
97
+ const CODEX_STEER_ALL_DEBOUNCE_MS = 500;
98
+ const CODEX_NATIVE_FIRST_DYNAMIC_TOOL_EXCLUDES = [
99
+ "read",
100
+ "write",
101
+ "edit",
102
+ "apply_patch",
103
+ "exec",
104
+ "process",
105
+ "update_plan",
106
+ ] as const;
107
+ const LOG_FIELD_MAX_LENGTH = 160;
108
+
109
+ type OpenClawCodingToolsOptions = NonNullable<
110
+ Parameters<(typeof import("openclaw/plugin-sdk/agent-harness"))["createOpenClawCodingTools"]>[0]
111
+ >;
112
+
113
+ let clientFactory = defaultCodexAppServerClientFactory;
114
+
115
+ function emitCodexAppServerEvent(
116
+ params: EmbeddedRunAttemptParams,
117
+ event: Parameters<NonNullable<EmbeddedRunAttemptParams["onAgentEvent"]>>[0],
118
+ ): void {
119
+ try {
120
+ emitGlobalAgentEvent({
121
+ runId: params.runId,
122
+ stream: event.stream,
123
+ data: event.data,
124
+ ...(params.sessionKey ? { sessionKey: params.sessionKey } : {}),
125
+ });
126
+ } catch (error) {
127
+ embeddedAgentLog.debug("codex app-server global agent event emit failed", { error });
128
+ }
129
+ try {
130
+ const maybePromise = params.onAgentEvent?.(event);
131
+ void Promise.resolve(maybePromise).catch((error: unknown) => {
132
+ embeddedAgentLog.debug("codex app-server agent event handler rejected", { error });
133
+ });
134
+ } catch (error) {
135
+ // Event consumers are observational; they must not abort or strand the
136
+ // canonical app-server turn lifecycle.
137
+ embeddedAgentLog.debug("codex app-server agent event handler threw", { error });
138
+ }
139
+ }
140
+
141
+ function collectTerminalAssistantText(result: EmbeddedRunAttemptResult): string {
142
+ return result.assistantTexts.join("\n\n").trim();
143
+ }
144
+
145
+ type CodexSteeringQueueOptions = {
146
+ steeringMode?: "all" | "one-at-a-time";
147
+ debounceMs?: number;
148
+ };
149
+
150
+ type DynamicToolTimeoutDetails = {
151
+ responseMessage: string;
152
+ consoleMessage: string;
153
+ meta: Record<string, unknown>;
154
+ };
155
+
156
+ function normalizeLogField(value: unknown): string | undefined {
157
+ if (typeof value !== "string") {
158
+ return undefined;
159
+ }
160
+ const normalized = value
161
+ .replaceAll(String.fromCharCode(27), " ")
162
+ .replaceAll("\r", " ")
163
+ .replaceAll("\n", " ")
164
+ .replaceAll("\t", " ")
165
+ .trim();
166
+ if (!normalized) {
167
+ return undefined;
168
+ }
169
+ return normalized.length > LOG_FIELD_MAX_LENGTH
170
+ ? `${normalized.slice(0, LOG_FIELD_MAX_LENGTH - 3)}...`
171
+ : normalized;
172
+ }
173
+
174
+ function readNumericTimeoutMs(value: unknown): number | undefined {
175
+ if (typeof value === "number" && Number.isFinite(value)) {
176
+ return Math.max(0, Math.floor(value));
177
+ }
178
+ if (typeof value === "string") {
179
+ const parsed = Number.parseInt(value.trim(), 10);
180
+ if (Number.isFinite(parsed)) {
181
+ return Math.max(0, Math.floor(parsed));
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+
187
+ function formatDynamicToolTimeoutDetails(params: {
188
+ call: CodexDynamicToolCallParams;
189
+ timeoutMs: number;
190
+ }): DynamicToolTimeoutDetails {
191
+ const tool = normalizeLogField(params.call.tool) ?? "unknown";
192
+ const baseMeta: Record<string, unknown> = {
193
+ tool: params.call.tool,
194
+ toolCallId: params.call.callId,
195
+ threadId: params.call.threadId,
196
+ turnId: params.call.turnId,
197
+ timeoutMs: params.timeoutMs,
198
+ timeoutKind: "codex_dynamic_tool_rpc",
199
+ };
200
+
201
+ if (tool !== "process" || !isJsonObject(params.call.arguments)) {
202
+ return {
203
+ responseMessage: `OpenClaw dynamic tool call timed out after ${params.timeoutMs}ms while running tool ${tool}.`,
204
+ consoleMessage: `codex dynamic tool timeout: tool=${tool} toolTimeoutMs=${params.timeoutMs}; per-tool-call watchdog, not session idle`,
205
+ meta: baseMeta,
206
+ };
207
+ }
208
+
209
+ const action = normalizeLogField(params.call.arguments.action);
210
+ const sessionId = normalizeLogField(params.call.arguments.sessionId);
211
+ const requestedTimeoutMs = readNumericTimeoutMs(params.call.arguments.timeout);
212
+ const actionPart = action ? ` action=${action}` : "";
213
+ const sessionPart = sessionId ? ` sessionId=${sessionId}` : "";
214
+ const requestedPart =
215
+ requestedTimeoutMs === undefined ? "" : ` requestedWaitMs=${requestedTimeoutMs}`;
216
+ const retryHint =
217
+ action === "poll"
218
+ ? "; repeated lines usually mean process-poll retry churn, not model progress"
219
+ : "";
220
+ const responseTarget =
221
+ action || sessionId
222
+ ? ` while waiting for process${actionPart}${sessionPart}`
223
+ : " while waiting for the process tool";
224
+
225
+ return {
226
+ responseMessage: `OpenClaw dynamic tool call timed out after ${params.timeoutMs}ms${responseTarget}. This is a tool RPC timeout, not a session idle timeout.`,
227
+ consoleMessage: `codex process tool timeout:${actionPart}${sessionPart} toolTimeoutMs=${params.timeoutMs}${requestedPart}; per-tool-call watchdog, not session idle${retryHint}`,
228
+ meta: {
229
+ ...baseMeta,
230
+ processAction: action,
231
+ processSessionId: sessionId,
232
+ processRequestedTimeoutMs: requestedTimeoutMs,
233
+ },
234
+ };
235
+ }
236
+
237
+ function createCodexSteeringQueue(params: {
238
+ client: CodexAppServerClient;
239
+ threadId: string;
240
+ turnId: string;
241
+ answerPendingUserInput: (text: string) => boolean;
242
+ signal: AbortSignal;
243
+ }) {
244
+ let batchedTexts: string[] = [];
245
+ let batchTimer: NodeJS.Timeout | undefined;
246
+ let sendChain: Promise<void> = Promise.resolve();
247
+
248
+ const clearBatchTimer = () => {
249
+ if (batchTimer) {
250
+ clearTimeout(batchTimer);
251
+ batchTimer = undefined;
252
+ }
253
+ };
254
+
255
+ const sendTexts = async (texts: string[]) => {
256
+ if (texts.length === 0 || params.signal.aborted) {
257
+ return;
258
+ }
259
+ await params.client.request("turn/steer", {
260
+ threadId: params.threadId,
261
+ expectedTurnId: params.turnId,
262
+ input: texts.map(toCodexTextInput),
263
+ });
264
+ };
265
+
266
+ const enqueueSend = (texts: string[]) => {
267
+ sendChain = sendChain
268
+ .then(() => sendTexts(texts))
269
+ .catch((error: unknown) => {
270
+ embeddedAgentLog.debug("codex app-server queued steer failed", { error });
271
+ });
272
+ return sendChain;
273
+ };
274
+
275
+ const flushBatch = () => {
276
+ clearBatchTimer();
277
+ const texts = batchedTexts;
278
+ batchedTexts = [];
279
+ return enqueueSend(texts);
280
+ };
281
+
282
+ return {
283
+ async queue(text: string, options?: CodexSteeringQueueOptions) {
284
+ if (params.answerPendingUserInput(text)) {
285
+ return;
286
+ }
287
+ if (options?.steeringMode === "one-at-a-time") {
288
+ await flushBatch();
289
+ await enqueueSend([text]);
290
+ return;
291
+ }
292
+ batchedTexts.push(text);
293
+ clearBatchTimer();
294
+ const debounceMs = normalizeCodexSteerDebounceMs(options?.debounceMs);
295
+ batchTimer = setTimeout(() => {
296
+ batchTimer = undefined;
297
+ void flushBatch();
298
+ }, debounceMs);
299
+ },
300
+ async flushPending() {
301
+ await flushBatch();
302
+ },
303
+ cancel() {
304
+ clearBatchTimer();
305
+ batchedTexts = [];
306
+ },
307
+ };
308
+ }
309
+
310
+ function normalizeCodexSteerDebounceMs(value: number | undefined): number {
311
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
312
+ ? Math.floor(value)
313
+ : CODEX_STEER_ALL_DEBOUNCE_MS;
314
+ }
315
+
316
+ function toCodexTextInput(text: string): CodexUserInput {
317
+ return { type: "text", text, text_elements: [] };
318
+ }
319
+
320
+ export async function runCodexAppServerAttempt(
321
+ params: EmbeddedRunAttemptParams,
322
+ options: {
323
+ pluginConfig?: unknown;
324
+ startupTimeoutFloorMs?: number;
325
+ nativeHookRelay?: {
326
+ enabled?: boolean;
327
+ events?: readonly NativeHookRelayEvent[];
328
+ ttlMs?: number;
329
+ gatewayTimeoutMs?: number;
330
+ hookTimeoutSec?: number;
331
+ };
332
+ turnCompletionIdleTimeoutMs?: number;
333
+ turnTerminalIdleTimeoutMs?: number;
334
+ } = {},
335
+ ): Promise<EmbeddedRunAttemptResult> {
336
+ const attemptStartedAt = Date.now();
337
+ const pluginConfig = readCodexPluginConfig(options.pluginConfig);
338
+ const appServer = resolveCodexAppServerRuntimeOptions({ pluginConfig });
339
+ const resolvedWorkspace = resolveUserPath(params.workspaceDir);
340
+ await fs.mkdir(resolvedWorkspace, { recursive: true });
341
+ const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
342
+ const sandbox = await resolveSandboxContext({
343
+ config: params.config,
344
+ sessionKey: sandboxSessionKey,
345
+ workspaceDir: resolvedWorkspace,
346
+ });
347
+ const effectiveWorkspace = sandbox?.enabled
348
+ ? sandbox.workspaceAccess === "rw"
349
+ ? resolvedWorkspace
350
+ : sandbox.workspaceDir
351
+ : resolvedWorkspace;
352
+ await fs.mkdir(effectiveWorkspace, { recursive: true });
353
+
354
+ const runAbortController = new AbortController();
355
+ const abortFromUpstream = () => {
356
+ runAbortController.abort(params.abortSignal?.reason ?? "upstream_abort");
357
+ };
358
+ if (params.abortSignal?.aborted) {
359
+ abortFromUpstream();
360
+ } else {
361
+ params.abortSignal?.addEventListener("abort", abortFromUpstream, { once: true });
362
+ }
363
+
364
+ const { sessionAgentId } = resolveSessionAgentIds({
365
+ sessionKey: params.sessionKey,
366
+ config: params.config,
367
+ agentId: params.agentId,
368
+ });
369
+ const agentDir = params.agentDir ?? resolveOpenClawAgentDir();
370
+ const runtimeParams = { ...params, sessionKey: sandboxSessionKey };
371
+ const activeContextEngine = isActiveHarnessContextEngine(params.contextEngine)
372
+ ? params.contextEngine
373
+ : undefined;
374
+ let yieldDetected = false;
375
+ const startupBinding = await readCodexAppServerBinding(params.sessionFile);
376
+ const startupAuthProfileId =
377
+ params.runtimePlan?.auth.forwardedAuthProfileId ??
378
+ params.authProfileId ??
379
+ startupBinding?.authProfileId;
380
+ const tools = await buildDynamicTools({
381
+ params,
382
+ resolvedWorkspace,
383
+ effectiveWorkspace,
384
+ sandboxSessionKey,
385
+ sandbox,
386
+ runAbortController,
387
+ sessionAgentId,
388
+ pluginConfig,
389
+ onYieldDetected: () => {
390
+ yieldDetected = true;
391
+ },
392
+ });
393
+ const toolBridge = createCodexDynamicToolBridge({
394
+ tools,
395
+ signal: runAbortController.signal,
396
+ hookContext: {
397
+ agentId: sessionAgentId,
398
+ sessionId: params.sessionId,
399
+ sessionKey: sandboxSessionKey,
400
+ runId: params.runId,
401
+ },
402
+ });
403
+ const hadSessionFile = await fileExists(params.sessionFile);
404
+ const sessionManager = activeContextEngine ? SessionManager.open(params.sessionFile) : undefined;
405
+ let historyMessages =
406
+ (await readMirroredSessionHistoryMessages(params.sessionFile, sessionManager)) ?? [];
407
+ const hookContext = {
408
+ runId: params.runId,
409
+ agentId: sessionAgentId,
410
+ sessionKey: sandboxSessionKey,
411
+ sessionId: params.sessionId,
412
+ workspaceDir: params.workspaceDir,
413
+ messageProvider: params.messageProvider ?? undefined,
414
+ trigger: params.trigger,
415
+ channelId: params.messageChannel ?? params.messageProvider ?? undefined,
416
+ };
417
+ if (activeContextEngine) {
418
+ await bootstrapHarnessContextEngine({
419
+ hadSessionFile,
420
+ contextEngine: activeContextEngine,
421
+ sessionId: params.sessionId,
422
+ sessionKey: sandboxSessionKey,
423
+ sessionFile: params.sessionFile,
424
+ sessionManager,
425
+ runtimeContext: buildHarnessContextEngineRuntimeContext({
426
+ attempt: runtimeParams,
427
+ workspaceDir: effectiveWorkspace,
428
+ agentDir,
429
+ tokenBudget: params.contextTokenBudget,
430
+ }),
431
+ runMaintenance: runHarnessContextEngineMaintenance,
432
+ warn: (message) => embeddedAgentLog.warn(message),
433
+ });
434
+ historyMessages =
435
+ (await readMirroredSessionHistoryMessages(params.sessionFile)) ?? historyMessages;
436
+ }
437
+ const baseDeveloperInstructions = buildDeveloperInstructions(params);
438
+ let promptText = params.prompt;
439
+ let developerInstructions = baseDeveloperInstructions;
440
+ let prePromptMessageCount = historyMessages.length;
441
+ if (activeContextEngine) {
442
+ try {
443
+ const assembled = await assembleHarnessContextEngine({
444
+ contextEngine: activeContextEngine,
445
+ sessionId: params.sessionId,
446
+ sessionKey: sandboxSessionKey,
447
+ messages: historyMessages,
448
+ tokenBudget: params.contextTokenBudget,
449
+ availableTools: new Set(toolBridge.specs.map((tool) => tool.name).filter(isNonEmptyString)),
450
+ citationsMode: params.config?.memory?.citations,
451
+ modelId: params.modelId,
452
+ prompt: params.prompt,
453
+ });
454
+ if (!assembled) {
455
+ throw new Error("context engine assemble returned no result");
456
+ }
457
+ const projection = projectContextEngineAssemblyForCodex({
458
+ assembledMessages: assembled.messages,
459
+ originalHistoryMessages: historyMessages,
460
+ prompt: params.prompt,
461
+ systemPromptAddition: assembled.systemPromptAddition,
462
+ });
463
+ promptText = projection.promptText;
464
+ developerInstructions = joinPresentSections(
465
+ baseDeveloperInstructions,
466
+ projection.developerInstructionAddition,
467
+ );
468
+ prePromptMessageCount = projection.prePromptMessageCount;
469
+ } catch (assembleErr) {
470
+ embeddedAgentLog.warn("context engine assemble failed; using Codex baseline prompt", {
471
+ error: formatErrorMessage(assembleErr),
472
+ });
473
+ }
474
+ }
475
+ const promptBuild = await resolveAgentHarnessBeforePromptBuildResult({
476
+ prompt: promptText,
477
+ developerInstructions,
478
+ messages: historyMessages,
479
+ ctx: hookContext,
480
+ });
481
+ const trajectoryRecorder = createCodexTrajectoryRecorder({
482
+ attempt: params,
483
+ cwd: effectiveWorkspace,
484
+ developerInstructions: promptBuild.developerInstructions,
485
+ prompt: promptBuild.prompt,
486
+ tools: toolBridge.specs,
487
+ });
488
+ let client: CodexAppServerClient;
489
+ let thread: CodexAppServerThreadBinding;
490
+ let trajectoryEndRecorded = false;
491
+ let nativeHookRelay: NativeHookRelayRegistrationHandle | undefined;
492
+ try {
493
+ emitCodexAppServerEvent(params, {
494
+ stream: "codex_app_server.lifecycle",
495
+ data: { phase: "startup" },
496
+ });
497
+ nativeHookRelay = createCodexNativeHookRelay({
498
+ options: options.nativeHookRelay,
499
+ agentId: sessionAgentId,
500
+ sessionId: params.sessionId,
501
+ sessionKey: sandboxSessionKey,
502
+ runId: params.runId,
503
+ signal: runAbortController.signal,
504
+ });
505
+ const nativeHookRelayConfig = nativeHookRelay
506
+ ? buildCodexNativeHookRelayConfig({
507
+ relay: nativeHookRelay,
508
+ events: options.nativeHookRelay?.events,
509
+ hookTimeoutSec: options.nativeHookRelay?.hookTimeoutSec,
510
+ })
511
+ : options.nativeHookRelay?.enabled === false
512
+ ? buildCodexNativeHookRelayDisabledConfig()
513
+ : undefined;
514
+ ({ client, thread } = await withCodexStartupTimeout({
515
+ timeoutMs: params.timeoutMs,
516
+ timeoutFloorMs: options.startupTimeoutFloorMs,
517
+ signal: runAbortController.signal,
518
+ operation: async () => {
519
+ const startupClient = await clientFactory(appServer.start, startupAuthProfileId, agentDir);
520
+ await ensureCodexComputerUse({
521
+ client: startupClient,
522
+ pluginConfig: options.pluginConfig,
523
+ timeoutMs: appServer.requestTimeoutMs,
524
+ signal: runAbortController.signal,
525
+ });
526
+ const startupThread = await startOrResumeThread({
527
+ client: startupClient,
528
+ params,
529
+ cwd: effectiveWorkspace,
530
+ dynamicTools: toolBridge.specs,
531
+ appServer,
532
+ developerInstructions: promptBuild.developerInstructions,
533
+ config: nativeHookRelayConfig,
534
+ });
535
+ return { client: startupClient, thread: startupThread };
536
+ },
537
+ }));
538
+ emitCodexAppServerEvent(params, {
539
+ stream: "codex_app_server.lifecycle",
540
+ data: { phase: "thread_ready", threadId: thread.threadId },
541
+ });
542
+ } catch (error) {
543
+ nativeHookRelay?.unregister();
544
+ clearSharedCodexAppServerClient();
545
+ params.abortSignal?.removeEventListener("abort", abortFromUpstream);
546
+ throw error;
547
+ }
548
+ trajectoryRecorder?.recordEvent("session.started", {
549
+ sessionFile: params.sessionFile,
550
+ threadId: thread.threadId,
551
+ authProfileId: startupAuthProfileId,
552
+ workspaceDir: effectiveWorkspace,
553
+ toolCount: toolBridge.specs.length,
554
+ });
555
+ recordCodexTrajectoryContext(trajectoryRecorder, {
556
+ attempt: params,
557
+ cwd: effectiveWorkspace,
558
+ developerInstructions: promptBuild.developerInstructions,
559
+ prompt: promptBuild.prompt,
560
+ tools: toolBridge.specs,
561
+ });
562
+
563
+ let projector: CodexAppServerEventProjector | undefined;
564
+ let turnId: string | undefined;
565
+ const pendingNotifications: CodexServerNotification[] = [];
566
+ let userInputBridge: ReturnType<typeof createCodexUserInputBridge> | undefined;
567
+ let steeringQueue: ReturnType<typeof createCodexSteeringQueue> | undefined;
568
+ let completed = false;
569
+ let timedOut = false;
570
+ let turnCompletionIdleTimedOut = false;
571
+ let turnCompletionIdleTimeoutMessage: string | undefined;
572
+ let lifecycleStarted = false;
573
+ let lifecycleTerminalEmitted = false;
574
+ let resolveCompletion: (() => void) | undefined;
575
+ const completion = new Promise<void>((resolve) => {
576
+ resolveCompletion = resolve;
577
+ });
578
+ let notificationQueue: Promise<void> = Promise.resolve();
579
+ const turnCompletionIdleTimeoutMs = resolveCodexTurnCompletionIdleTimeoutMs(
580
+ options.turnCompletionIdleTimeoutMs,
581
+ );
582
+ const turnTerminalIdleTimeoutMs = resolveCodexTurnTerminalIdleTimeoutMs(
583
+ options.turnTerminalIdleTimeoutMs,
584
+ );
585
+ let turnCompletionIdleTimer: ReturnType<typeof setTimeout> | undefined;
586
+ let turnCompletionIdleWatchArmed = false;
587
+ let turnTerminalIdleTimer: ReturnType<typeof setTimeout> | undefined;
588
+ let turnTerminalIdleWatchArmed = false;
589
+ let turnCompletionLastActivityAt = Date.now();
590
+ let turnCompletionLastActivityReason = "startup";
591
+ let activeAppServerTurnRequests = 0;
592
+
593
+ const clearTurnCompletionIdleTimer = () => {
594
+ if (turnCompletionIdleTimer) {
595
+ clearTimeout(turnCompletionIdleTimer);
596
+ turnCompletionIdleTimer = undefined;
597
+ }
598
+ };
599
+
600
+ const clearTurnTerminalIdleTimer = () => {
601
+ if (turnTerminalIdleTimer) {
602
+ clearTimeout(turnTerminalIdleTimer);
603
+ turnTerminalIdleTimer = undefined;
604
+ }
605
+ };
606
+
607
+ const fireTurnCompletionIdleTimeout = () => {
608
+ if (
609
+ completed ||
610
+ runAbortController.signal.aborted ||
611
+ !turnCompletionIdleWatchArmed ||
612
+ activeAppServerTurnRequests > 0
613
+ ) {
614
+ return;
615
+ }
616
+ const idleMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
617
+ if (idleMs < turnCompletionIdleTimeoutMs) {
618
+ scheduleTurnCompletionIdleWatch();
619
+ return;
620
+ }
621
+ timedOut = true;
622
+ turnCompletionIdleTimedOut = true;
623
+ turnCompletionIdleTimeoutMessage =
624
+ "codex app-server turn idle timed out waiting for turn/completed";
625
+ projector?.markTimedOut();
626
+ trajectoryRecorder?.recordEvent("turn.completion_idle_timeout", {
627
+ threadId: thread.threadId,
628
+ turnId,
629
+ idleMs,
630
+ timeoutMs: turnCompletionIdleTimeoutMs,
631
+ lastActivityReason: turnCompletionLastActivityReason,
632
+ });
633
+ embeddedAgentLog.warn("codex app-server turn idle timed out waiting for completion", {
634
+ threadId: thread.threadId,
635
+ turnId,
636
+ idleMs,
637
+ timeoutMs: turnCompletionIdleTimeoutMs,
638
+ lastActivityReason: turnCompletionLastActivityReason,
639
+ });
640
+ runAbortController.abort("turn_completion_idle_timeout");
641
+ };
642
+
643
+ const fireTurnTerminalIdleTimeout = () => {
644
+ if (
645
+ completed ||
646
+ runAbortController.signal.aborted ||
647
+ !turnTerminalIdleWatchArmed ||
648
+ activeAppServerTurnRequests > 0
649
+ ) {
650
+ return;
651
+ }
652
+ const idleMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
653
+ if (idleMs < turnTerminalIdleTimeoutMs) {
654
+ scheduleTurnTerminalIdleWatch();
655
+ return;
656
+ }
657
+ timedOut = true;
658
+ turnCompletionIdleTimedOut = true;
659
+ turnCompletionIdleTimeoutMessage =
660
+ "codex app-server turn idle timed out waiting for turn/completed";
661
+ projector?.markTimedOut();
662
+ trajectoryRecorder?.recordEvent("turn.terminal_idle_timeout", {
663
+ threadId: thread.threadId,
664
+ turnId,
665
+ idleMs,
666
+ timeoutMs: turnTerminalIdleTimeoutMs,
667
+ lastActivityReason: turnCompletionLastActivityReason,
668
+ });
669
+ embeddedAgentLog.warn("codex app-server turn idle timed out waiting for terminal event", {
670
+ threadId: thread.threadId,
671
+ turnId,
672
+ idleMs,
673
+ timeoutMs: turnTerminalIdleTimeoutMs,
674
+ lastActivityReason: turnCompletionLastActivityReason,
675
+ });
676
+ runAbortController.abort("turn_terminal_idle_timeout");
677
+ };
678
+
679
+ function scheduleTurnCompletionIdleWatch() {
680
+ clearTurnCompletionIdleTimer();
681
+ if (
682
+ completed ||
683
+ runAbortController.signal.aborted ||
684
+ !turnCompletionIdleWatchArmed ||
685
+ activeAppServerTurnRequests > 0
686
+ ) {
687
+ return;
688
+ }
689
+ const elapsedMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
690
+ const delayMs = Math.max(1, turnCompletionIdleTimeoutMs - elapsedMs);
691
+ turnCompletionIdleTimer = setTimeout(fireTurnCompletionIdleTimeout, delayMs);
692
+ turnCompletionIdleTimer.unref?.();
693
+ }
694
+
695
+ function scheduleTurnTerminalIdleWatch() {
696
+ clearTurnTerminalIdleTimer();
697
+ if (
698
+ completed ||
699
+ runAbortController.signal.aborted ||
700
+ !turnTerminalIdleWatchArmed ||
701
+ activeAppServerTurnRequests > 0
702
+ ) {
703
+ return;
704
+ }
705
+ const elapsedMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
706
+ const delayMs = Math.max(1, turnTerminalIdleTimeoutMs - elapsedMs);
707
+ turnTerminalIdleTimer = setTimeout(fireTurnTerminalIdleTimeout, delayMs);
708
+ turnTerminalIdleTimer.unref?.();
709
+ }
710
+
711
+ const touchTurnCompletionActivity = (reason: string, options?: { arm?: boolean }) => {
712
+ turnCompletionLastActivityAt = Date.now();
713
+ turnCompletionLastActivityReason = reason;
714
+ emitTrustedDiagnosticEvent({
715
+ type: "run.progress",
716
+ runId: params.runId,
717
+ sessionId: params.sessionId,
718
+ sessionKey: params.sessionKey,
719
+ reason: `codex_app_server:${reason}`,
720
+ });
721
+ if (options?.arm) {
722
+ turnCompletionIdleWatchArmed = true;
723
+ }
724
+ scheduleTurnCompletionIdleWatch();
725
+ scheduleTurnTerminalIdleWatch();
726
+ };
727
+
728
+ const emitLifecycleStart = () => {
729
+ emitCodexAppServerEvent(params, {
730
+ stream: "lifecycle",
731
+ data: { phase: "start", startedAt: attemptStartedAt },
732
+ });
733
+ lifecycleStarted = true;
734
+ };
735
+
736
+ const emitLifecycleTerminal = (data: Record<string, unknown> & { phase: "end" | "error" }) => {
737
+ if (!lifecycleStarted || lifecycleTerminalEmitted) {
738
+ return;
739
+ }
740
+ emitCodexAppServerEvent(params, {
741
+ stream: "lifecycle",
742
+ data: {
743
+ startedAt: attemptStartedAt,
744
+ endedAt: Date.now(),
745
+ ...data,
746
+ },
747
+ });
748
+ lifecycleTerminalEmitted = true;
749
+ };
750
+
751
+ const handleNotification = async (notification: CodexServerNotification) => {
752
+ touchTurnCompletionActivity(`notification:${notification.method}`);
753
+ userInputBridge?.handleNotification(notification);
754
+ if (!projector || !turnId) {
755
+ pendingNotifications.push(notification);
756
+ return;
757
+ }
758
+ // Determine terminal-turn status before invoking the projector so a throw
759
+ // inside projector.handleNotification still releases the session lane.
760
+ // See openclaw/openclaw#67996.
761
+ const isTurnCompletion =
762
+ notification.method === "turn/completed" &&
763
+ isTurnNotification(notification.params, thread.threadId, turnId);
764
+ try {
765
+ await projector.handleNotification(notification);
766
+ } catch (error) {
767
+ embeddedAgentLog.debug("codex app-server projector notification threw", {
768
+ method: notification.method,
769
+ error,
770
+ });
771
+ } finally {
772
+ if (isTurnCompletion) {
773
+ if (!timedOut && !runAbortController.signal.aborted) {
774
+ await steeringQueue?.flushPending();
775
+ }
776
+ completed = true;
777
+ clearTurnCompletionIdleTimer();
778
+ clearTurnTerminalIdleTimer();
779
+ resolveCompletion?.();
780
+ }
781
+ }
782
+ };
783
+ const enqueueNotification = (notification: CodexServerNotification): Promise<void> => {
784
+ notificationQueue = notificationQueue.then(
785
+ () => handleNotification(notification),
786
+ () => handleNotification(notification),
787
+ );
788
+ return notificationQueue;
789
+ };
790
+
791
+ const notificationCleanup = client.addNotificationHandler(enqueueNotification);
792
+ const requestCleanup = client.addRequestHandler(async (request) => {
793
+ activeAppServerTurnRequests += 1;
794
+ clearTurnCompletionIdleTimer();
795
+ touchTurnCompletionActivity(`request:${request.method}`);
796
+ let armCompletionWatchOnResponse = false;
797
+ try {
798
+ if (request.method === "account/chatgptAuthTokens/refresh") {
799
+ return refreshCodexAppServerAuthTokens({
800
+ agentDir,
801
+ authProfileId: startupAuthProfileId,
802
+ });
803
+ }
804
+ if (!turnId) {
805
+ return undefined;
806
+ }
807
+ if (request.method === "mcpServer/elicitation/request") {
808
+ armCompletionWatchOnResponse = true;
809
+ return handleCodexAppServerElicitationRequest({
810
+ requestParams: request.params,
811
+ paramsForRun: params,
812
+ threadId: thread.threadId,
813
+ turnId,
814
+ signal: runAbortController.signal,
815
+ });
816
+ }
817
+ if (request.method === "item/tool/requestUserInput") {
818
+ armCompletionWatchOnResponse = true;
819
+ return userInputBridge?.handleRequest({
820
+ id: request.id,
821
+ params: request.params,
822
+ });
823
+ }
824
+ if (request.method !== "item/tool/call") {
825
+ if (isCodexAppServerApprovalRequest(request.method)) {
826
+ armCompletionWatchOnResponse = true;
827
+ return handleApprovalRequest({
828
+ method: request.method,
829
+ params: request.params,
830
+ paramsForRun: params,
831
+ threadId: thread.threadId,
832
+ turnId,
833
+ signal: runAbortController.signal,
834
+ });
835
+ }
836
+ return undefined;
837
+ }
838
+ const call = readDynamicToolCallParams(request.params);
839
+ if (!call || call.threadId !== thread.threadId || call.turnId !== turnId) {
840
+ return undefined;
841
+ }
842
+ armCompletionWatchOnResponse = true;
843
+ trajectoryRecorder?.recordEvent("tool.call", {
844
+ threadId: call.threadId,
845
+ turnId: call.turnId,
846
+ toolCallId: call.callId,
847
+ name: call.tool,
848
+ arguments: call.arguments,
849
+ });
850
+ const response = await handleDynamicToolCallWithTimeout({
851
+ call,
852
+ toolBridge,
853
+ signal: runAbortController.signal,
854
+ timeoutMs: CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
855
+ onTimeout: () => {
856
+ trajectoryRecorder?.recordEvent("tool.timeout", {
857
+ threadId: call.threadId,
858
+ turnId: call.turnId,
859
+ toolCallId: call.callId,
860
+ name: call.tool,
861
+ timeoutMs: CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
862
+ });
863
+ },
864
+ });
865
+ trajectoryRecorder?.recordEvent("tool.result", {
866
+ threadId: call.threadId,
867
+ turnId: call.turnId,
868
+ toolCallId: call.callId,
869
+ name: call.tool,
870
+ success: response.success,
871
+ contentItems: response.contentItems,
872
+ });
873
+ return response as JsonValue;
874
+ } finally {
875
+ activeAppServerTurnRequests = Math.max(0, activeAppServerTurnRequests - 1);
876
+ touchTurnCompletionActivity(`request:${request.method}:response`, {
877
+ arm: armCompletionWatchOnResponse,
878
+ });
879
+ }
880
+ });
881
+
882
+ const llmInputEvent = {
883
+ runId: params.runId,
884
+ sessionId: params.sessionId,
885
+ provider: params.provider,
886
+ model: params.modelId,
887
+ systemPrompt: promptBuild.developerInstructions,
888
+ prompt: promptBuild.prompt,
889
+ historyMessages,
890
+ imagesCount: params.images?.length ?? 0,
891
+ };
892
+ const turnStartFailureMessages = [
893
+ ...historyMessages,
894
+ {
895
+ role: "user",
896
+ content: [{ type: "text", text: promptBuild.prompt }],
897
+ },
898
+ ];
899
+
900
+ let turn: CodexTurnStartResponse;
901
+ try {
902
+ runAgentHarnessLlmInputHook({
903
+ event: llmInputEvent,
904
+ ctx: hookContext,
905
+ });
906
+ emitCodexAppServerEvent(params, {
907
+ stream: "codex_app_server.lifecycle",
908
+ data: { phase: "turn_starting", threadId: thread.threadId },
909
+ });
910
+ turn = assertCodexTurnStartResponse(
911
+ await client.request(
912
+ "turn/start",
913
+ buildTurnStartParams(params, {
914
+ threadId: thread.threadId,
915
+ cwd: effectiveWorkspace,
916
+ appServer,
917
+ promptText: promptBuild.prompt,
918
+ }),
919
+ { timeoutMs: params.timeoutMs, signal: runAbortController.signal },
920
+ ),
921
+ );
922
+ } catch (error) {
923
+ emitCodexAppServerEvent(params, {
924
+ stream: "codex_app_server.lifecycle",
925
+ data: { phase: "turn_start_failed", error: formatErrorMessage(error) },
926
+ });
927
+ trajectoryRecorder?.recordEvent("session.ended", {
928
+ status: "error",
929
+ threadId: thread.threadId,
930
+ timedOut,
931
+ aborted: runAbortController.signal.aborted,
932
+ promptError: normalizeCodexTrajectoryError(error),
933
+ });
934
+ trajectoryEndRecorded = true;
935
+ runAgentHarnessLlmOutputHook({
936
+ event: {
937
+ runId: params.runId,
938
+ sessionId: params.sessionId,
939
+ provider: params.provider,
940
+ model: params.modelId,
941
+ resolvedRef:
942
+ params.runtimePlan?.observability.resolvedRef ?? `${params.provider}/${params.modelId}`,
943
+ ...(params.runtimePlan?.observability.harnessId
944
+ ? { harnessId: params.runtimePlan.observability.harnessId }
945
+ : {}),
946
+ assistantTexts: [],
947
+ },
948
+ ctx: hookContext,
949
+ });
950
+ runAgentHarnessAgentEndHook({
951
+ event: {
952
+ messages: turnStartFailureMessages,
953
+ success: false,
954
+ error: formatErrorMessage(error),
955
+ durationMs: Date.now() - attemptStartedAt,
956
+ },
957
+ ctx: hookContext,
958
+ });
959
+ notificationCleanup();
960
+ requestCleanup();
961
+ nativeHookRelay?.unregister();
962
+ await runAgentCleanupStep({
963
+ runId: params.runId,
964
+ sessionId: params.sessionId,
965
+ step: "codex-trajectory-flush-startup-failure",
966
+ log: embeddedAgentLog,
967
+ cleanup: async () => {
968
+ await trajectoryRecorder?.flush();
969
+ },
970
+ });
971
+ params.abortSignal?.removeEventListener("abort", abortFromUpstream);
972
+ throw error;
973
+ }
974
+ turnId = turn.turn.id;
975
+ const activeTurnId = turn.turn.id;
976
+ userInputBridge = createCodexUserInputBridge({
977
+ paramsForRun: params,
978
+ threadId: thread.threadId,
979
+ turnId: activeTurnId,
980
+ signal: runAbortController.signal,
981
+ });
982
+ trajectoryRecorder?.recordEvent("prompt.submitted", {
983
+ threadId: thread.threadId,
984
+ turnId: activeTurnId,
985
+ prompt: promptBuild.prompt,
986
+ imagesCount: params.images?.length ?? 0,
987
+ });
988
+ projector = new CodexAppServerEventProjector(params, thread.threadId, activeTurnId);
989
+ emitLifecycleStart();
990
+ const activeProjector = projector;
991
+ for (const notification of pendingNotifications.splice(0)) {
992
+ await enqueueNotification(notification);
993
+ }
994
+ if (!completed && isTerminalTurnStatus(turn.turn.status)) {
995
+ await enqueueNotification({
996
+ method: "turn/completed",
997
+ params: {
998
+ threadId: thread.threadId,
999
+ turnId: activeTurnId,
1000
+ turn: turn.turn as unknown as JsonObject,
1001
+ },
1002
+ });
1003
+ }
1004
+
1005
+ const activeSteeringQueue = createCodexSteeringQueue({
1006
+ client,
1007
+ threadId: thread.threadId,
1008
+ turnId: activeTurnId,
1009
+ answerPendingUserInput: (text) => userInputBridge?.handleQueuedMessage(text) ?? false,
1010
+ signal: runAbortController.signal,
1011
+ });
1012
+ steeringQueue = activeSteeringQueue;
1013
+ const handle = {
1014
+ kind: "embedded" as const,
1015
+ queueMessage: async (text: string, options?: CodexSteeringQueueOptions) =>
1016
+ activeSteeringQueue.queue(text, options),
1017
+ isStreaming: () => !completed,
1018
+ isCompacting: () => projector?.isCompacting() ?? false,
1019
+ cancel: () => runAbortController.abort("cancelled"),
1020
+ abort: () => runAbortController.abort("aborted"),
1021
+ };
1022
+ setActiveEmbeddedRun(params.sessionId, handle, params.sessionKey);
1023
+ turnTerminalIdleWatchArmed = true;
1024
+ touchTurnCompletionActivity("turn:start");
1025
+
1026
+ const timeout = setTimeout(
1027
+ () => {
1028
+ timedOut = true;
1029
+ projector?.markTimedOut();
1030
+ runAbortController.abort("timeout");
1031
+ },
1032
+ Math.max(100, params.timeoutMs),
1033
+ );
1034
+
1035
+ const abortListener = () => {
1036
+ interruptCodexTurnBestEffort(client, {
1037
+ threadId: thread.threadId,
1038
+ turnId: activeTurnId,
1039
+ });
1040
+ resolveCompletion?.();
1041
+ };
1042
+ runAbortController.signal.addEventListener("abort", abortListener, { once: true });
1043
+ if (runAbortController.signal.aborted) {
1044
+ abortListener();
1045
+ }
1046
+
1047
+ try {
1048
+ await completion;
1049
+ const result = activeProjector.buildResult(toolBridge.telemetry, { yieldDetected });
1050
+ const finalAborted = result.aborted || runAbortController.signal.aborted;
1051
+ const finalPromptError = turnCompletionIdleTimedOut
1052
+ ? turnCompletionIdleTimeoutMessage
1053
+ : timedOut
1054
+ ? "codex app-server attempt timed out"
1055
+ : result.promptError;
1056
+ const finalPromptErrorSource = timedOut ? "prompt" : result.promptErrorSource;
1057
+ recordCodexTrajectoryCompletion(trajectoryRecorder, {
1058
+ attempt: params,
1059
+ result,
1060
+ threadId: thread.threadId,
1061
+ turnId: activeTurnId,
1062
+ timedOut,
1063
+ yieldDetected,
1064
+ });
1065
+ trajectoryRecorder?.recordEvent("session.ended", {
1066
+ status: finalPromptError ? "error" : finalAborted || timedOut ? "interrupted" : "success",
1067
+ threadId: thread.threadId,
1068
+ turnId: activeTurnId,
1069
+ timedOut,
1070
+ yieldDetected,
1071
+ promptError: normalizeCodexTrajectoryError(finalPromptError),
1072
+ });
1073
+ trajectoryEndRecorded = true;
1074
+ await mirrorTranscriptBestEffort({
1075
+ params,
1076
+ agentId: sessionAgentId,
1077
+ result,
1078
+ sessionKey: sandboxSessionKey,
1079
+ threadId: thread.threadId,
1080
+ turnId: activeTurnId,
1081
+ });
1082
+ const terminalAssistantText = collectTerminalAssistantText(result);
1083
+ if (terminalAssistantText && !finalAborted && !finalPromptError) {
1084
+ emitCodexAppServerEvent(params, {
1085
+ stream: "assistant",
1086
+ data: { text: terminalAssistantText },
1087
+ });
1088
+ }
1089
+ if (finalPromptError) {
1090
+ emitLifecycleTerminal({
1091
+ phase: "error",
1092
+ error: formatErrorMessage(finalPromptError),
1093
+ });
1094
+ } else {
1095
+ emitLifecycleTerminal({
1096
+ phase: "end",
1097
+ ...(finalAborted ? { aborted: true } : {}),
1098
+ });
1099
+ }
1100
+ if (activeContextEngine) {
1101
+ const finalMessages =
1102
+ (await readMirroredSessionHistoryMessages(params.sessionFile)) ??
1103
+ historyMessages.concat(result.messagesSnapshot);
1104
+ await finalizeHarnessContextEngineTurn({
1105
+ contextEngine: activeContextEngine,
1106
+ promptError: Boolean(finalPromptError),
1107
+ aborted: finalAborted,
1108
+ yieldAborted: Boolean(result.yieldDetected),
1109
+ sessionIdUsed: params.sessionId,
1110
+ sessionKey: sandboxSessionKey,
1111
+ sessionFile: params.sessionFile,
1112
+ messagesSnapshot: finalMessages,
1113
+ prePromptMessageCount,
1114
+ tokenBudget: params.contextTokenBudget,
1115
+ runtimeContext: buildHarnessContextEngineRuntimeContextFromUsage({
1116
+ attempt: runtimeParams,
1117
+ workspaceDir: effectiveWorkspace,
1118
+ agentDir,
1119
+ tokenBudget: params.contextTokenBudget,
1120
+ lastCallUsage: result.attemptUsage,
1121
+ promptCache: result.promptCache,
1122
+ }),
1123
+ runMaintenance: runHarnessContextEngineMaintenance,
1124
+ sessionManager,
1125
+ warn: (message) => embeddedAgentLog.warn(message),
1126
+ });
1127
+ }
1128
+ runAgentHarnessLlmOutputHook({
1129
+ event: {
1130
+ runId: params.runId,
1131
+ sessionId: params.sessionId,
1132
+ provider: params.provider,
1133
+ model: params.modelId,
1134
+ resolvedRef:
1135
+ params.runtimePlan?.observability.resolvedRef ?? `${params.provider}/${params.modelId}`,
1136
+ ...(params.runtimePlan?.observability.harnessId
1137
+ ? { harnessId: params.runtimePlan.observability.harnessId }
1138
+ : {}),
1139
+ assistantTexts: result.assistantTexts,
1140
+ ...(result.lastAssistant ? { lastAssistant: result.lastAssistant } : {}),
1141
+ ...(result.attemptUsage ? { usage: result.attemptUsage } : {}),
1142
+ },
1143
+ ctx: hookContext,
1144
+ });
1145
+ runAgentHarnessAgentEndHook({
1146
+ event: {
1147
+ messages: result.messagesSnapshot,
1148
+ success: !finalAborted && !finalPromptError,
1149
+ ...(finalPromptError ? { error: formatErrorMessage(finalPromptError) } : {}),
1150
+ durationMs: Date.now() - attemptStartedAt,
1151
+ },
1152
+ ctx: hookContext,
1153
+ });
1154
+ return {
1155
+ ...result,
1156
+ timedOut,
1157
+ aborted: finalAborted,
1158
+ promptError: finalPromptError,
1159
+ promptErrorSource: finalPromptErrorSource,
1160
+ };
1161
+ } finally {
1162
+ emitLifecycleTerminal({
1163
+ phase: "error",
1164
+ error: "codex app-server run completed without lifecycle terminal event",
1165
+ });
1166
+ if (trajectoryRecorder && !trajectoryEndRecorded) {
1167
+ trajectoryRecorder.recordEvent("session.ended", {
1168
+ status: timedOut || runAbortController.signal.aborted ? "interrupted" : "cleanup",
1169
+ threadId: thread.threadId,
1170
+ turnId: activeTurnId,
1171
+ timedOut,
1172
+ aborted: runAbortController.signal.aborted,
1173
+ });
1174
+ }
1175
+ await runAgentCleanupStep({
1176
+ runId: params.runId,
1177
+ sessionId: params.sessionId,
1178
+ step: "codex-trajectory-flush",
1179
+ log: embeddedAgentLog,
1180
+ cleanup: async () => {
1181
+ await trajectoryRecorder?.flush();
1182
+ },
1183
+ });
1184
+ if (!timedOut && !runAbortController.signal.aborted) {
1185
+ await steeringQueue?.flushPending();
1186
+ }
1187
+ userInputBridge?.cancelPending();
1188
+ clearTimeout(timeout);
1189
+ clearTurnCompletionIdleTimer();
1190
+ clearTurnTerminalIdleTimer();
1191
+ notificationCleanup();
1192
+ requestCleanup();
1193
+ nativeHookRelay?.unregister();
1194
+ runAbortController.signal.removeEventListener("abort", abortListener);
1195
+ params.abortSignal?.removeEventListener("abort", abortFromUpstream);
1196
+ steeringQueue?.cancel();
1197
+ clearActiveEmbeddedRun(params.sessionId, handle, params.sessionKey);
1198
+ }
1199
+ }
1200
+
1201
+ async function handleDynamicToolCallWithTimeout(params: {
1202
+ call: CodexDynamicToolCallParams;
1203
+ toolBridge: Pick<CodexDynamicToolBridge, "handleToolCall">;
1204
+ signal: AbortSignal;
1205
+ timeoutMs: number;
1206
+ onTimeout?: () => void;
1207
+ }): Promise<CodexDynamicToolCallResponse> {
1208
+ if (params.signal.aborted) {
1209
+ return failedDynamicToolResponse("OpenClaw dynamic tool call aborted before execution.");
1210
+ }
1211
+
1212
+ const controller = new AbortController();
1213
+ let timeout: ReturnType<typeof setTimeout> | undefined;
1214
+ let timedOut = false;
1215
+ let resolveAbort: ((response: CodexDynamicToolCallResponse) => void) | undefined;
1216
+ const abortFromRun = () => {
1217
+ const message = "OpenClaw dynamic tool call aborted.";
1218
+ controller.abort(params.signal.reason ?? new Error(message));
1219
+ resolveAbort?.(failedDynamicToolResponse(message));
1220
+ };
1221
+ const abortPromise = new Promise<CodexDynamicToolCallResponse>((resolve) => {
1222
+ resolveAbort = resolve;
1223
+ });
1224
+ const timeoutPromise = new Promise<CodexDynamicToolCallResponse>((resolve) => {
1225
+ const timeoutMs = Math.max(1, Math.min(CODEX_DYNAMIC_TOOL_TIMEOUT_MS, params.timeoutMs));
1226
+ timeout = setTimeout(() => {
1227
+ timedOut = true;
1228
+ const timeoutDetails = formatDynamicToolTimeoutDetails({ call: params.call, timeoutMs });
1229
+ controller.abort(new Error(timeoutDetails.responseMessage));
1230
+ params.onTimeout?.();
1231
+ embeddedAgentLog.warn("codex dynamic tool call timed out", {
1232
+ ...timeoutDetails.meta,
1233
+ consoleMessage: timeoutDetails.consoleMessage,
1234
+ });
1235
+ resolve(failedDynamicToolResponse(timeoutDetails.responseMessage));
1236
+ }, timeoutMs);
1237
+ timeout.unref?.();
1238
+ });
1239
+
1240
+ try {
1241
+ params.signal.addEventListener("abort", abortFromRun, { once: true });
1242
+ if (params.signal.aborted) {
1243
+ abortFromRun();
1244
+ }
1245
+ return await Promise.race([
1246
+ params.toolBridge.handleToolCall(params.call, { signal: controller.signal }),
1247
+ abortPromise,
1248
+ timeoutPromise,
1249
+ ]);
1250
+ } catch (error) {
1251
+ return failedDynamicToolResponse(error instanceof Error ? error.message : String(error));
1252
+ } finally {
1253
+ if (timeout) {
1254
+ clearTimeout(timeout);
1255
+ }
1256
+ params.signal.removeEventListener("abort", abortFromRun);
1257
+ resolveAbort = undefined;
1258
+ if (!timedOut && !controller.signal.aborted) {
1259
+ controller.abort(new Error("OpenClaw dynamic tool call finished."));
1260
+ }
1261
+ }
1262
+ }
1263
+
1264
+ function failedDynamicToolResponse(message: string): CodexDynamicToolCallResponse {
1265
+ return {
1266
+ success: false,
1267
+ contentItems: [{ type: "inputText", text: message }],
1268
+ };
1269
+ }
1270
+
1271
+ function createCodexNativeHookRelay(params: {
1272
+ options:
1273
+ | {
1274
+ enabled?: boolean;
1275
+ events?: readonly NativeHookRelayEvent[];
1276
+ ttlMs?: number;
1277
+ gatewayTimeoutMs?: number;
1278
+ }
1279
+ | undefined;
1280
+ agentId: string | undefined;
1281
+ sessionId: string;
1282
+ sessionKey: string | undefined;
1283
+ runId: string;
1284
+ signal: AbortSignal;
1285
+ }): NativeHookRelayRegistrationHandle | undefined {
1286
+ if (params.options?.enabled === false) {
1287
+ return undefined;
1288
+ }
1289
+ return registerNativeHookRelay({
1290
+ provider: "codex",
1291
+ relayId: buildCodexNativeHookRelayId({
1292
+ agentId: params.agentId,
1293
+ sessionId: params.sessionId,
1294
+ sessionKey: params.sessionKey,
1295
+ }),
1296
+ ...(params.agentId ? { agentId: params.agentId } : {}),
1297
+ sessionId: params.sessionId,
1298
+ ...(params.sessionKey ? { sessionKey: params.sessionKey } : {}),
1299
+ runId: params.runId,
1300
+ allowedEvents: params.options?.events ?? CODEX_NATIVE_HOOK_RELAY_EVENTS,
1301
+ ttlMs: params.options?.ttlMs,
1302
+ signal: params.signal,
1303
+ command: {
1304
+ timeoutMs: params.options?.gatewayTimeoutMs,
1305
+ },
1306
+ });
1307
+ }
1308
+
1309
+ function buildCodexNativeHookRelayId(params: {
1310
+ agentId: string | undefined;
1311
+ sessionId: string;
1312
+ sessionKey: string | undefined;
1313
+ }): string {
1314
+ const hash = createHash("sha256");
1315
+ hash.update("openclaw:codex:native-hook-relay:v1");
1316
+ hash.update("\0");
1317
+ hash.update(params.agentId?.trim() || "");
1318
+ hash.update("\0");
1319
+ hash.update(params.sessionKey?.trim() || params.sessionId);
1320
+ return `codex-${hash.digest("hex").slice(0, 40)}`;
1321
+ }
1322
+
1323
+ function interruptCodexTurnBestEffort(
1324
+ client: CodexAppServerClient,
1325
+ params: {
1326
+ threadId: string;
1327
+ turnId: string;
1328
+ },
1329
+ ): void {
1330
+ void Promise.resolve()
1331
+ .then(() => client.request("turn/interrupt", params))
1332
+ .catch((error: unknown) => {
1333
+ embeddedAgentLog.debug("codex app-server turn interrupt failed during abort", { error });
1334
+ });
1335
+ }
1336
+
1337
+ type DynamicToolBuildParams = {
1338
+ params: EmbeddedRunAttemptParams;
1339
+ resolvedWorkspace: string;
1340
+ effectiveWorkspace: string;
1341
+ sandboxSessionKey: string;
1342
+ sandbox: Awaited<ReturnType<typeof resolveSandboxContext>>;
1343
+ runAbortController: AbortController;
1344
+ sessionAgentId: string | undefined;
1345
+ pluginConfig: CodexPluginConfig;
1346
+ onYieldDetected: () => void;
1347
+ };
1348
+
1349
+ async function buildDynamicTools(input: DynamicToolBuildParams) {
1350
+ const { params } = input;
1351
+ if (params.disableTools || !supportsModelTools(params.model)) {
1352
+ return [];
1353
+ }
1354
+ const modelHasVision = params.model.input?.includes("image") ?? false;
1355
+ const agentDir = params.agentDir ?? resolveOpenClawAgentDir();
1356
+ const { createOpenClawCodingTools } = await import("openclaw/plugin-sdk/agent-harness");
1357
+ const allTools = createOpenClawCodingTools({
1358
+ agentId: input.sessionAgentId,
1359
+ ...buildEmbeddedAttemptToolRunContext(params),
1360
+ exec: {
1361
+ ...params.execOverrides,
1362
+ elevated: params.bashElevated,
1363
+ },
1364
+ sandbox: input.sandbox,
1365
+ messageProvider: params.messageChannel ?? params.messageProvider,
1366
+ agentAccountId: params.agentAccountId,
1367
+ messageTo: params.messageTo,
1368
+ messageThreadId: params.messageThreadId,
1369
+ groupId: params.groupId,
1370
+ groupChannel: params.groupChannel,
1371
+ groupSpace: params.groupSpace,
1372
+ spawnedBy: params.spawnedBy,
1373
+ senderId: params.senderId,
1374
+ senderName: params.senderName,
1375
+ senderUsername: params.senderUsername,
1376
+ senderE164: params.senderE164,
1377
+ senderIsOwner: params.senderIsOwner,
1378
+ allowGatewaySubagentBinding: params.allowGatewaySubagentBinding,
1379
+ sessionKey: input.sandboxSessionKey,
1380
+ sessionId: params.sessionId,
1381
+ runId: params.runId,
1382
+ agentDir,
1383
+ workspaceDir: input.effectiveWorkspace,
1384
+ spawnWorkspaceDir: resolveAttemptSpawnWorkspaceDir({
1385
+ sandbox: input.sandbox,
1386
+ resolvedWorkspace: input.resolvedWorkspace,
1387
+ }),
1388
+ config: params.config,
1389
+ abortSignal: input.runAbortController.signal,
1390
+ modelProvider: params.model.provider,
1391
+ modelId: params.modelId,
1392
+ modelCompat:
1393
+ params.model.compat && typeof params.model.compat === "object"
1394
+ ? (params.model.compat as OpenClawCodingToolsOptions["modelCompat"])
1395
+ : undefined,
1396
+ modelApi: params.model.api,
1397
+ modelContextWindowTokens: params.model.contextWindow,
1398
+ modelAuthMode: resolveModelAuthMode(params.model.provider, params.config, undefined, {
1399
+ workspaceDir: input.effectiveWorkspace,
1400
+ }),
1401
+ suppressManagedWebSearch: false,
1402
+ currentChannelId: params.currentChannelId,
1403
+ currentThreadTs: params.currentThreadTs,
1404
+ currentMessageId: params.currentMessageId,
1405
+ replyToMode: params.replyToMode,
1406
+ hasRepliedRef: params.hasRepliedRef,
1407
+ modelHasVision,
1408
+ requireExplicitMessageTarget:
1409
+ params.requireExplicitMessageTarget ?? isSubagentSessionKey(params.sessionKey),
1410
+ disableMessageTool: params.disableMessageTool,
1411
+ enableHeartbeatTool: params.trigger === "heartbeat",
1412
+ forceHeartbeatTool: params.trigger === "heartbeat",
1413
+ onYield: (message) => {
1414
+ input.onYieldDetected();
1415
+ emitCodexAppServerEvent(params, {
1416
+ stream: "codex_app_server.tool",
1417
+ data: { name: "sessions_yield", message },
1418
+ });
1419
+ input.runAbortController.abort("sessions_yield");
1420
+ },
1421
+ });
1422
+ const profiledTools = applyCodexDynamicToolProfile(allTools, input.pluginConfig);
1423
+ const visionFilteredTools = filterToolsForVisionInputs(profiledTools, {
1424
+ modelHasVision,
1425
+ hasInboundImages: (params.images?.length ?? 0) > 0,
1426
+ });
1427
+ const filteredTools =
1428
+ params.toolsAllow && params.toolsAllow.length > 0
1429
+ ? visionFilteredTools.filter((tool) => params.toolsAllow?.includes(tool.name))
1430
+ : visionFilteredTools;
1431
+ return normalizeAgentRuntimeTools({
1432
+ runtimePlan: params.runtimePlan,
1433
+ tools: filteredTools,
1434
+ provider: params.provider,
1435
+ config: params.config,
1436
+ workspaceDir: input.effectiveWorkspace,
1437
+ env: process.env,
1438
+ modelId: params.modelId,
1439
+ modelApi: params.model.api,
1440
+ model: params.model,
1441
+ });
1442
+ }
1443
+
1444
+ function applyCodexDynamicToolProfile<T extends { name: string }>(
1445
+ tools: T[],
1446
+ config: CodexPluginConfig,
1447
+ ): T[] {
1448
+ const excludes = new Set<string>();
1449
+ const profile = config.codexDynamicToolsProfile ?? "native-first";
1450
+ if (profile === "native-first") {
1451
+ for (const name of CODEX_NATIVE_FIRST_DYNAMIC_TOOL_EXCLUDES) {
1452
+ excludes.add(name);
1453
+ }
1454
+ }
1455
+ for (const name of config.codexDynamicToolsExclude ?? []) {
1456
+ const trimmed = name.trim();
1457
+ if (trimmed) {
1458
+ excludes.add(trimmed);
1459
+ }
1460
+ }
1461
+ return excludes.size === 0 ? tools : tools.filter((tool) => !excludes.has(tool.name));
1462
+ }
1463
+
1464
+ async function withCodexStartupTimeout<T>(params: {
1465
+ timeoutMs: number;
1466
+ timeoutFloorMs?: number;
1467
+ signal: AbortSignal;
1468
+ operation: () => Promise<T>;
1469
+ }): Promise<T> {
1470
+ if (params.signal.aborted) {
1471
+ throw new Error("codex app-server startup aborted");
1472
+ }
1473
+ let timeout: NodeJS.Timeout | undefined;
1474
+ let abortCleanup: (() => void) | undefined;
1475
+ try {
1476
+ return await Promise.race([
1477
+ params.operation(),
1478
+ new Promise<never>((_, reject) => {
1479
+ const rejectOnce = (error: Error) => {
1480
+ if (timeout) {
1481
+ clearTimeout(timeout);
1482
+ timeout = undefined;
1483
+ }
1484
+ reject(error);
1485
+ };
1486
+ const timeoutMs = Math.max(params.timeoutFloorMs ?? 100, params.timeoutMs);
1487
+ timeout = setTimeout(() => {
1488
+ rejectOnce(new Error("codex app-server startup timed out"));
1489
+ }, timeoutMs);
1490
+ const abortListener = () => rejectOnce(new Error("codex app-server startup aborted"));
1491
+ params.signal.addEventListener("abort", abortListener, { once: true });
1492
+ abortCleanup = () => params.signal.removeEventListener("abort", abortListener);
1493
+ }),
1494
+ ]);
1495
+ } finally {
1496
+ if (timeout) {
1497
+ clearTimeout(timeout);
1498
+ }
1499
+ abortCleanup?.();
1500
+ }
1501
+ }
1502
+
1503
+ function resolveCodexTurnCompletionIdleTimeoutMs(value: number | undefined): number {
1504
+ if (value === undefined) {
1505
+ return CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS;
1506
+ }
1507
+ if (!Number.isFinite(value)) {
1508
+ return CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS;
1509
+ }
1510
+ return Math.max(1, Math.floor(value));
1511
+ }
1512
+
1513
+ function resolveCodexTurnTerminalIdleTimeoutMs(value: number | undefined): number {
1514
+ if (value === undefined) {
1515
+ return CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS;
1516
+ }
1517
+ if (!Number.isFinite(value)) {
1518
+ return CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS;
1519
+ }
1520
+ return Math.max(1, Math.floor(value));
1521
+ }
1522
+
1523
+ function readDynamicToolCallParams(
1524
+ value: JsonValue | undefined,
1525
+ ): CodexDynamicToolCallParams | undefined {
1526
+ return readCodexDynamicToolCallParams(value);
1527
+ }
1528
+
1529
+ function isTurnNotification(
1530
+ value: JsonValue | undefined,
1531
+ threadId: string,
1532
+ turnId: string,
1533
+ ): boolean {
1534
+ if (!isJsonObject(value)) {
1535
+ return false;
1536
+ }
1537
+ return readString(value, "threadId") === threadId && readNotificationTurnId(value) === turnId;
1538
+ }
1539
+
1540
+ function isTerminalTurnStatus(status: string | undefined): boolean {
1541
+ return status === "completed" || status === "interrupted" || status === "failed";
1542
+ }
1543
+
1544
+ function readNotificationTurnId(record: JsonObject): string | undefined {
1545
+ return readString(record, "turnId") ?? readNestedTurnId(record);
1546
+ }
1547
+
1548
+ function readNestedTurnId(record: JsonObject): string | undefined {
1549
+ const turn = record.turn;
1550
+ return isJsonObject(turn) ? readString(turn, "id") : undefined;
1551
+ }
1552
+
1553
+ function readString(record: JsonObject, key: string): string | undefined {
1554
+ const value = record[key];
1555
+ return typeof value === "string" ? value : undefined;
1556
+ }
1557
+
1558
+ async function readMirroredSessionHistoryMessages(
1559
+ sessionFile: string,
1560
+ sessionManager?: Pick<SessionManager, "buildSessionContext">,
1561
+ ): Promise<AgentMessage[] | undefined> {
1562
+ const messages = await readCodexMirroredSessionHistoryMessages(sessionFile, sessionManager);
1563
+ if (!messages) {
1564
+ embeddedAgentLog.warn("failed to read mirrored session history for codex harness hooks", {
1565
+ sessionFile,
1566
+ });
1567
+ }
1568
+ return messages;
1569
+ }
1570
+
1571
+ async function mirrorTranscriptBestEffort(params: {
1572
+ params: EmbeddedRunAttemptParams;
1573
+ agentId?: string;
1574
+ result: EmbeddedRunAttemptResult;
1575
+ sessionKey?: string;
1576
+ threadId: string;
1577
+ turnId: string;
1578
+ }): Promise<void> {
1579
+ try {
1580
+ await mirrorCodexAppServerTranscript({
1581
+ sessionFile: params.params.sessionFile,
1582
+ agentId: params.agentId,
1583
+ sessionKey: params.sessionKey,
1584
+ messages: params.result.messagesSnapshot,
1585
+ idempotencyScope: `codex-app-server:${params.threadId}:${params.turnId}`,
1586
+ });
1587
+ } catch (error) {
1588
+ embeddedAgentLog.warn("failed to mirror codex app-server transcript", { error });
1589
+ }
1590
+ }
1591
+
1592
+ async function fileExists(filePath: string): Promise<boolean> {
1593
+ try {
1594
+ await fs.stat(filePath);
1595
+ return true;
1596
+ } catch (error) {
1597
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") {
1598
+ return false;
1599
+ }
1600
+ throw error;
1601
+ }
1602
+ }
1603
+
1604
+ function isNonEmptyString(value: unknown): value is string {
1605
+ return typeof value === "string" && value.length > 0;
1606
+ }
1607
+
1608
+ function joinPresentSections(...sections: Array<string | undefined>): string {
1609
+ return sections.filter((section): section is string => Boolean(section?.trim())).join("\n\n");
1610
+ }
1611
+
1612
+ function handleApprovalRequest(params: {
1613
+ method: string;
1614
+ params: JsonValue | undefined;
1615
+ paramsForRun: EmbeddedRunAttemptParams;
1616
+ threadId: string;
1617
+ turnId: string;
1618
+ signal?: AbortSignal;
1619
+ }): Promise<JsonValue | undefined> {
1620
+ return handleCodexAppServerApprovalRequest({
1621
+ method: params.method,
1622
+ requestParams: params.params,
1623
+ paramsForRun: params.paramsForRun,
1624
+ threadId: params.threadId,
1625
+ turnId: params.turnId,
1626
+ signal: params.signal,
1627
+ });
1628
+ }
1629
+
1630
+ export const __testing = {
1631
+ CODEX_DYNAMIC_TOOL_TIMEOUT_MS,
1632
+ CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS,
1633
+ CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS,
1634
+ buildCodexNativeHookRelayId,
1635
+ applyCodexDynamicToolProfile,
1636
+ filterToolsForVisionInputs,
1637
+ handleDynamicToolCallWithTimeout,
1638
+ ...createCodexAppServerClientFactoryTestHooks((factory) => {
1639
+ clientFactory = factory;
1640
+ }),
1641
+ } as const;