@openclaw/codex 2026.5.2-beta.2 → 2026.5.3-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 (622) hide show
  1. package/dist/capabilities-CYg1OFaL.js +22 -0
  2. package/dist/client-Bm5-MMSf.js +622 -0
  3. package/dist/client-factory-Bh5chnqU.js +18 -0
  4. package/dist/command-handlers-Dxx2slu2.js +992 -0
  5. package/dist/compact-CpZ5DNlM.js +260 -0
  6. package/dist/computer-use-BblypQuj.js +380 -0
  7. package/dist/config-CkkoMeqF.js +244 -0
  8. package/dist/conversation-binding-D12ISGdf.js +549 -0
  9. package/dist/harness.js +41 -0
  10. package/dist/index.js +351 -0
  11. package/dist/media-understanding-provider.js +234 -0
  12. package/dist/models-Ddmxtdog.js +108 -0
  13. package/dist/prompt-overlay.js +12 -0
  14. package/dist/protocol-C9UWI98H.js +9 -0
  15. package/dist/protocol-validators-Cpopom3_.js +5762 -0
  16. package/dist/provider-catalog.js +84 -0
  17. package/dist/provider-discovery.js +33 -0
  18. package/dist/provider.js +150 -0
  19. package/dist/rolldown-runtime-DUslC3ob.js +14 -0
  20. package/dist/run-attempt-C5v380B8.js +3541 -0
  21. package/dist/session-binding-C7Y7rY0i.js +95 -0
  22. package/dist/shared-client-DEzBJ9G1.js +434 -0
  23. package/dist/test-api.js +42 -0
  24. package/dist/thread-lifecycle-BKZiIxyU.js +460 -0
  25. package/package.json +18 -3
  26. package/harness.ts +0 -59
  27. package/index.test.ts +0 -106
  28. package/index.ts +0 -41
  29. package/media-understanding-provider.test.ts +0 -300
  30. package/media-understanding-provider.ts +0 -369
  31. package/prompt-overlay-runtime-contract.test.ts +0 -45
  32. package/prompt-overlay.ts +0 -19
  33. package/provider-catalog.ts +0 -83
  34. package/provider-discovery.ts +0 -45
  35. package/provider.test.ts +0 -350
  36. package/provider.ts +0 -223
  37. package/src/app-server/approval-bridge.test.ts +0 -838
  38. package/src/app-server/approval-bridge.ts +0 -731
  39. package/src/app-server/auth-bridge.test.ts +0 -922
  40. package/src/app-server/auth-bridge.ts +0 -345
  41. package/src/app-server/auth-profile-runtime-contract.test.ts +0 -218
  42. package/src/app-server/capabilities.ts +0 -27
  43. package/src/app-server/client-factory.ts +0 -30
  44. package/src/app-server/client.test.ts +0 -463
  45. package/src/app-server/client.ts +0 -675
  46. package/src/app-server/compact.test.ts +0 -452
  47. package/src/app-server/compact.ts +0 -375
  48. package/src/app-server/computer-use.test.ts +0 -790
  49. package/src/app-server/computer-use.ts +0 -682
  50. package/src/app-server/config.test.ts +0 -431
  51. package/src/app-server/config.ts +0 -486
  52. package/src/app-server/context-engine-projection.test.ts +0 -104
  53. package/src/app-server/context-engine-projection.ts +0 -147
  54. package/src/app-server/delivery-no-reply-runtime-contract.test.ts +0 -80
  55. package/src/app-server/dynamic-tool-profile.ts +0 -31
  56. package/src/app-server/dynamic-tools.test.ts +0 -781
  57. package/src/app-server/dynamic-tools.ts +0 -345
  58. package/src/app-server/elicitation-bridge.test.ts +0 -625
  59. package/src/app-server/elicitation-bridge.ts +0 -555
  60. package/src/app-server/event-projector.test.ts +0 -921
  61. package/src/app-server/event-projector.ts +0 -1161
  62. package/src/app-server/managed-binary.test.ts +0 -141
  63. package/src/app-server/managed-binary.ts +0 -192
  64. package/src/app-server/models.test.ts +0 -242
  65. package/src/app-server/models.ts +0 -168
  66. package/src/app-server/native-hook-relay.test.ts +0 -143
  67. package/src/app-server/native-hook-relay.ts +0 -64
  68. package/src/app-server/openclaw-owned-tool-runtime-contract.test.ts +0 -415
  69. package/src/app-server/outcome-fallback-runtime-contract.test.ts +0 -352
  70. package/src/app-server/plugin-approval-roundtrip.ts +0 -122
  71. package/src/app-server/protocol-generated/json/DynamicToolCallParams.json +0 -24
  72. package/src/app-server/protocol-generated/json/v2/ErrorNotification.json +0 -162
  73. package/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +0 -86
  74. package/src/app-server/protocol-generated/json/v2/ModelListResponse.json +0 -162
  75. package/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +0 -1994
  76. package/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +0 -1994
  77. package/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +0 -1243
  78. package/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +0 -1240
  79. package/src/app-server/protocol-generated/typescript/AbsolutePathBuf.ts +0 -14
  80. package/src/app-server/protocol-generated/typescript/AgentPath.ts +0 -5
  81. package/src/app-server/protocol-generated/typescript/ApplyPatchApprovalParams.ts +0 -24
  82. package/src/app-server/protocol-generated/typescript/ApplyPatchApprovalResponse.ts +0 -6
  83. package/src/app-server/protocol-generated/typescript/AuthMode.ts +0 -8
  84. package/src/app-server/protocol-generated/typescript/ClientInfo.ts +0 -5
  85. package/src/app-server/protocol-generated/typescript/ClientNotification.ts +0 -5
  86. package/src/app-server/protocol-generated/typescript/ClientRequest.ts +0 -165
  87. package/src/app-server/protocol-generated/typescript/CollaborationMode.ts +0 -10
  88. package/src/app-server/protocol-generated/typescript/ContentItem.ts +0 -9
  89. package/src/app-server/protocol-generated/typescript/ConversationGitInfo.ts +0 -9
  90. package/src/app-server/protocol-generated/typescript/ConversationSummary.ts +0 -19
  91. package/src/app-server/protocol-generated/typescript/ExecCommandApprovalParams.ts +0 -22
  92. package/src/app-server/protocol-generated/typescript/ExecCommandApprovalResponse.ts +0 -6
  93. package/src/app-server/protocol-generated/typescript/ExecPolicyAmendment.ts +0 -12
  94. package/src/app-server/protocol-generated/typescript/FileChange.ts +0 -8
  95. package/src/app-server/protocol-generated/typescript/ForcedLoginMethod.ts +0 -5
  96. package/src/app-server/protocol-generated/typescript/FunctionCallOutputBody.ts +0 -6
  97. package/src/app-server/protocol-generated/typescript/FunctionCallOutputContentItem.ts +0 -12
  98. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchMatchType.ts +0 -5
  99. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchParams.ts +0 -9
  100. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchResponse.ts +0 -6
  101. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchResult.ts +0 -16
  102. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchSessionCompletedNotification.ts +0 -5
  103. package/src/app-server/protocol-generated/typescript/FuzzyFileSearchSessionUpdatedNotification.ts +0 -10
  104. package/src/app-server/protocol-generated/typescript/GetAuthStatusParams.ts +0 -5
  105. package/src/app-server/protocol-generated/typescript/GetAuthStatusResponse.ts +0 -10
  106. package/src/app-server/protocol-generated/typescript/GetConversationSummaryParams.ts +0 -6
  107. package/src/app-server/protocol-generated/typescript/GetConversationSummaryResponse.ts +0 -6
  108. package/src/app-server/protocol-generated/typescript/GhostCommit.ts +0 -13
  109. package/src/app-server/protocol-generated/typescript/GitDiffToRemoteParams.ts +0 -5
  110. package/src/app-server/protocol-generated/typescript/GitDiffToRemoteResponse.ts +0 -6
  111. package/src/app-server/protocol-generated/typescript/GitSha.ts +0 -5
  112. package/src/app-server/protocol-generated/typescript/ImageDetail.ts +0 -5
  113. package/src/app-server/protocol-generated/typescript/InitializeCapabilities.ts +0 -18
  114. package/src/app-server/protocol-generated/typescript/InitializeParams.ts +0 -10
  115. package/src/app-server/protocol-generated/typescript/InitializeResponse.ts +0 -22
  116. package/src/app-server/protocol-generated/typescript/InputModality.ts +0 -8
  117. package/src/app-server/protocol-generated/typescript/LocalShellAction.ts +0 -6
  118. package/src/app-server/protocol-generated/typescript/LocalShellExecAction.ts +0 -11
  119. package/src/app-server/protocol-generated/typescript/LocalShellStatus.ts +0 -5
  120. package/src/app-server/protocol-generated/typescript/MessagePhase.ts +0 -11
  121. package/src/app-server/protocol-generated/typescript/ModeKind.ts +0 -8
  122. package/src/app-server/protocol-generated/typescript/NetworkPolicyAmendment.ts +0 -6
  123. package/src/app-server/protocol-generated/typescript/NetworkPolicyRuleAction.ts +0 -5
  124. package/src/app-server/protocol-generated/typescript/ParsedCommand.ts +0 -20
  125. package/src/app-server/protocol-generated/typescript/Personality.ts +0 -5
  126. package/src/app-server/protocol-generated/typescript/PlanType.ts +0 -17
  127. package/src/app-server/protocol-generated/typescript/RealtimeConversationVersion.ts +0 -5
  128. package/src/app-server/protocol-generated/typescript/RealtimeOutputModality.ts +0 -5
  129. package/src/app-server/protocol-generated/typescript/RealtimeVoice.ts +0 -24
  130. package/src/app-server/protocol-generated/typescript/RealtimeVoicesList.ts +0 -11
  131. package/src/app-server/protocol-generated/typescript/ReasoningEffort.ts +0 -8
  132. package/src/app-server/protocol-generated/typescript/ReasoningItemContent.ts +0 -7
  133. package/src/app-server/protocol-generated/typescript/ReasoningItemReasoningSummary.ts +0 -5
  134. package/src/app-server/protocol-generated/typescript/ReasoningSummary.ts +0 -10
  135. package/src/app-server/protocol-generated/typescript/RequestId.ts +0 -5
  136. package/src/app-server/protocol-generated/typescript/Resource.ts +0 -19
  137. package/src/app-server/protocol-generated/typescript/ResourceContent.ts +0 -27
  138. package/src/app-server/protocol-generated/typescript/ResourceTemplate.ts +0 -16
  139. package/src/app-server/protocol-generated/typescript/ResponseItem.ts +0 -70
  140. package/src/app-server/protocol-generated/typescript/ReviewDecision.ts +0 -17
  141. package/src/app-server/protocol-generated/typescript/ServerNotification.ts +0 -144
  142. package/src/app-server/protocol-generated/typescript/ServerRequest.ts +0 -47
  143. package/src/app-server/protocol-generated/typescript/ServiceTier.ts +0 -5
  144. package/src/app-server/protocol-generated/typescript/SessionSource.ts +0 -13
  145. package/src/app-server/protocol-generated/typescript/Settings.ts +0 -13
  146. package/src/app-server/protocol-generated/typescript/SubAgentSource.ts +0 -20
  147. package/src/app-server/protocol-generated/typescript/ThreadId.ts +0 -5
  148. package/src/app-server/protocol-generated/typescript/ThreadMemoryMode.ts +0 -5
  149. package/src/app-server/protocol-generated/typescript/Tool.ts +0 -18
  150. package/src/app-server/protocol-generated/typescript/Verbosity.ts +0 -9
  151. package/src/app-server/protocol-generated/typescript/WebSearchAction.ts +0 -9
  152. package/src/app-server/protocol-generated/typescript/WebSearchContextSize.ts +0 -5
  153. package/src/app-server/protocol-generated/typescript/WebSearchLocation.ts +0 -10
  154. package/src/app-server/protocol-generated/typescript/WebSearchMode.ts +0 -5
  155. package/src/app-server/protocol-generated/typescript/WebSearchToolConfig.ts +0 -11
  156. package/src/app-server/protocol-generated/typescript/index.ts +0 -80
  157. package/src/app-server/protocol-generated/typescript/serde_json/JsonValue.ts +0 -11
  158. package/src/app-server/protocol-generated/typescript/v2/Account.ts +0 -9
  159. package/src/app-server/protocol-generated/typescript/v2/AccountLoginCompletedNotification.ts +0 -9
  160. package/src/app-server/protocol-generated/typescript/v2/AccountRateLimitsUpdatedNotification.ts +0 -6
  161. package/src/app-server/protocol-generated/typescript/v2/AccountUpdatedNotification.ts +0 -7
  162. package/src/app-server/protocol-generated/typescript/v2/AddCreditsNudgeCreditType.ts +0 -5
  163. package/src/app-server/protocol-generated/typescript/v2/AddCreditsNudgeEmailStatus.ts +0 -5
  164. package/src/app-server/protocol-generated/typescript/v2/AdditionalFileSystemPermissions.ts +0 -18
  165. package/src/app-server/protocol-generated/typescript/v2/AdditionalNetworkPermissions.ts +0 -5
  166. package/src/app-server/protocol-generated/typescript/v2/AdditionalPermissionProfile.ts +0 -10
  167. package/src/app-server/protocol-generated/typescript/v2/AgentMessageDeltaNotification.ts +0 -10
  168. package/src/app-server/protocol-generated/typescript/v2/AnalyticsConfig.ts +0 -14
  169. package/src/app-server/protocol-generated/typescript/v2/AppBranding.ts +0 -15
  170. package/src/app-server/protocol-generated/typescript/v2/AppInfo.ts +0 -32
  171. package/src/app-server/protocol-generated/typescript/v2/AppListUpdatedNotification.ts +0 -9
  172. package/src/app-server/protocol-generated/typescript/v2/AppMetadata.ts +0 -20
  173. package/src/app-server/protocol-generated/typescript/v2/AppReview.ts +0 -5
  174. package/src/app-server/protocol-generated/typescript/v2/AppScreenshot.ts +0 -5
  175. package/src/app-server/protocol-generated/typescript/v2/AppSummary.ts +0 -14
  176. package/src/app-server/protocol-generated/typescript/v2/AppToolApproval.ts +0 -5
  177. package/src/app-server/protocol-generated/typescript/v2/AppToolsConfig.ts +0 -8
  178. package/src/app-server/protocol-generated/typescript/v2/ApprovalsReviewer.ts +0 -12
  179. package/src/app-server/protocol-generated/typescript/v2/AppsConfig.ts +0 -17
  180. package/src/app-server/protocol-generated/typescript/v2/AppsDefaultConfig.ts +0 -9
  181. package/src/app-server/protocol-generated/typescript/v2/AppsListParams.ts +0 -25
  182. package/src/app-server/protocol-generated/typescript/v2/AppsListResponse.ts +0 -16
  183. package/src/app-server/protocol-generated/typescript/v2/AskForApproval.ts +0 -18
  184. package/src/app-server/protocol-generated/typescript/v2/AutoReviewDecisionSource.ts +0 -8
  185. package/src/app-server/protocol-generated/typescript/v2/ByteRange.ts +0 -5
  186. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountParams.ts +0 -5
  187. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountResponse.ts +0 -6
  188. package/src/app-server/protocol-generated/typescript/v2/CancelLoginAccountStatus.ts +0 -5
  189. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshParams.ts +0 -18
  190. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshReason.ts +0 -5
  191. package/src/app-server/protocol-generated/typescript/v2/ChatgptAuthTokensRefreshResponse.ts +0 -9
  192. package/src/app-server/protocol-generated/typescript/v2/CodexErrorInfo.ts +0 -27
  193. package/src/app-server/protocol-generated/typescript/v2/CollabAgentState.ts +0 -6
  194. package/src/app-server/protocol-generated/typescript/v2/CollabAgentStatus.ts +0 -12
  195. package/src/app-server/protocol-generated/typescript/v2/CollabAgentTool.ts +0 -5
  196. package/src/app-server/protocol-generated/typescript/v2/CollabAgentToolCallStatus.ts +0 -5
  197. package/src/app-server/protocol-generated/typescript/v2/CollaborationModeMask.ts +0 -15
  198. package/src/app-server/protocol-generated/typescript/v2/CommandAction.ts +0 -10
  199. package/src/app-server/protocol-generated/typescript/v2/CommandExecOutputDeltaNotification.ts +0 -31
  200. package/src/app-server/protocol-generated/typescript/v2/CommandExecOutputStream.ts +0 -8
  201. package/src/app-server/protocol-generated/typescript/v2/CommandExecParams.ts +0 -107
  202. package/src/app-server/protocol-generated/typescript/v2/CommandExecResizeParams.ts +0 -19
  203. package/src/app-server/protocol-generated/typescript/v2/CommandExecResizeResponse.ts +0 -8
  204. package/src/app-server/protocol-generated/typescript/v2/CommandExecResponse.ts +0 -25
  205. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminalSize.ts +0 -17
  206. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminateParams.ts +0 -14
  207. package/src/app-server/protocol-generated/typescript/v2/CommandExecTerminateResponse.ts +0 -8
  208. package/src/app-server/protocol-generated/typescript/v2/CommandExecWriteParams.ts +0 -23
  209. package/src/app-server/protocol-generated/typescript/v2/CommandExecWriteResponse.ts +0 -8
  210. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionApprovalDecision.ts +0 -13
  211. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionOutputDeltaNotification.ts +0 -10
  212. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionRequestApprovalParams.ts +0 -62
  213. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionRequestApprovalResponse.ts +0 -8
  214. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionSource.ts +0 -9
  215. package/src/app-server/protocol-generated/typescript/v2/CommandExecutionStatus.ts +0 -5
  216. package/src/app-server/protocol-generated/typescript/v2/Config.ts +0 -54
  217. package/src/app-server/protocol-generated/typescript/v2/ConfigBatchWriteParams.ts +0 -17
  218. package/src/app-server/protocol-generated/typescript/v2/ConfigEdit.ts +0 -7
  219. package/src/app-server/protocol-generated/typescript/v2/ConfigLayer.ts +0 -12
  220. package/src/app-server/protocol-generated/typescript/v2/ConfigLayerMetadata.ts +0 -6
  221. package/src/app-server/protocol-generated/typescript/v2/ConfigLayerSource.ts +0 -27
  222. package/src/app-server/protocol-generated/typescript/v2/ConfigReadParams.ts +0 -13
  223. package/src/app-server/protocol-generated/typescript/v2/ConfigReadResponse.ts +0 -12
  224. package/src/app-server/protocol-generated/typescript/v2/ConfigRequirements.ts +0 -15
  225. package/src/app-server/protocol-generated/typescript/v2/ConfigRequirementsReadResponse.ts +0 -11
  226. package/src/app-server/protocol-generated/typescript/v2/ConfigValueWriteParams.ts +0 -16
  227. package/src/app-server/protocol-generated/typescript/v2/ConfigWarningNotification.ts +0 -23
  228. package/src/app-server/protocol-generated/typescript/v2/ConfigWriteResponse.ts +0 -16
  229. package/src/app-server/protocol-generated/typescript/v2/ConfiguredHookHandler.ts +0 -14
  230. package/src/app-server/protocol-generated/typescript/v2/ConfiguredHookMatcherGroup.ts +0 -9
  231. package/src/app-server/protocol-generated/typescript/v2/ContextCompactedNotification.ts +0 -8
  232. package/src/app-server/protocol-generated/typescript/v2/CreditsSnapshot.ts +0 -5
  233. package/src/app-server/protocol-generated/typescript/v2/DeprecationNoticeNotification.ts +0 -14
  234. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyAlgorithm.ts +0 -8
  235. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyCreateParams.ts +0 -16
  236. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyCreateResponse.ts +0 -18
  237. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyProtectionClass.ts +0 -11
  238. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyProtectionPolicy.ts +0 -8
  239. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyPublicParams.ts +0 -8
  240. package/src/app-server/protocol-generated/typescript/v2/DeviceKeyPublicResponse.ts +0 -18
  241. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignParams.ts +0 -9
  242. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignPayload.ts +0 -68
  243. package/src/app-server/protocol-generated/typescript/v2/DeviceKeySignResponse.ts +0 -20
  244. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallOutputContentItem.ts +0 -7
  245. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallParams.ts +0 -13
  246. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallResponse.ts +0 -9
  247. package/src/app-server/protocol-generated/typescript/v2/DynamicToolCallStatus.ts +0 -5
  248. package/src/app-server/protocol-generated/typescript/v2/DynamicToolSpec.ts +0 -12
  249. package/src/app-server/protocol-generated/typescript/v2/ErrorNotification.ts +0 -11
  250. package/src/app-server/protocol-generated/typescript/v2/ExecPolicyAmendment.ts +0 -5
  251. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeature.ts +0 -38
  252. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureEnablementSetParams.ts +0 -13
  253. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureEnablementSetResponse.ts +0 -10
  254. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureListParams.ts +0 -14
  255. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureListResponse.ts +0 -13
  256. package/src/app-server/protocol-generated/typescript/v2/ExperimentalFeatureStage.ts +0 -10
  257. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigDetectParams.ts +0 -14
  258. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigDetectResponse.ts +0 -6
  259. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportCompletedNotification.ts +0 -5
  260. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportParams.ts +0 -8
  261. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigImportResponse.ts +0 -5
  262. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigMigrationItem.ts +0 -15
  263. package/src/app-server/protocol-generated/typescript/v2/ExternalAgentConfigMigrationItemType.ts +0 -10
  264. package/src/app-server/protocol-generated/typescript/v2/FeedbackUploadParams.ts +0 -12
  265. package/src/app-server/protocol-generated/typescript/v2/FeedbackUploadResponse.ts +0 -5
  266. package/src/app-server/protocol-generated/typescript/v2/FileChangeApprovalDecision.ts +0 -5
  267. package/src/app-server/protocol-generated/typescript/v2/FileChangeOutputDeltaNotification.ts +0 -10
  268. package/src/app-server/protocol-generated/typescript/v2/FileChangePatchUpdatedNotification.ts +0 -11
  269. package/src/app-server/protocol-generated/typescript/v2/FileChangeRequestApprovalParams.ts +0 -18
  270. package/src/app-server/protocol-generated/typescript/v2/FileChangeRequestApprovalResponse.ts +0 -6
  271. package/src/app-server/protocol-generated/typescript/v2/FileSystemAccessMode.ts +0 -5
  272. package/src/app-server/protocol-generated/typescript/v2/FileSystemPath.ts +0 -10
  273. package/src/app-server/protocol-generated/typescript/v2/FileSystemSandboxEntry.ts +0 -7
  274. package/src/app-server/protocol-generated/typescript/v2/FileSystemSpecialPath.ts +0 -12
  275. package/src/app-server/protocol-generated/typescript/v2/FileUpdateChange.ts +0 -6
  276. package/src/app-server/protocol-generated/typescript/v2/FsChangedNotification.ts +0 -18
  277. package/src/app-server/protocol-generated/typescript/v2/FsCopyParams.ts +0 -22
  278. package/src/app-server/protocol-generated/typescript/v2/FsCopyResponse.ts +0 -8
  279. package/src/app-server/protocol-generated/typescript/v2/FsCreateDirectoryParams.ts +0 -18
  280. package/src/app-server/protocol-generated/typescript/v2/FsCreateDirectoryResponse.ts +0 -8
  281. package/src/app-server/protocol-generated/typescript/v2/FsGetMetadataParams.ts +0 -14
  282. package/src/app-server/protocol-generated/typescript/v2/FsGetMetadataResponse.ts +0 -29
  283. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryEntry.ts +0 -21
  284. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryParams.ts +0 -14
  285. package/src/app-server/protocol-generated/typescript/v2/FsReadDirectoryResponse.ts +0 -14
  286. package/src/app-server/protocol-generated/typescript/v2/FsReadFileParams.ts +0 -14
  287. package/src/app-server/protocol-generated/typescript/v2/FsReadFileResponse.ts +0 -13
  288. package/src/app-server/protocol-generated/typescript/v2/FsRemoveParams.ts +0 -22
  289. package/src/app-server/protocol-generated/typescript/v2/FsRemoveResponse.ts +0 -8
  290. package/src/app-server/protocol-generated/typescript/v2/FsUnwatchParams.ts +0 -13
  291. package/src/app-server/protocol-generated/typescript/v2/FsUnwatchResponse.ts +0 -8
  292. package/src/app-server/protocol-generated/typescript/v2/FsWatchParams.ts +0 -18
  293. package/src/app-server/protocol-generated/typescript/v2/FsWatchResponse.ts +0 -14
  294. package/src/app-server/protocol-generated/typescript/v2/FsWriteFileParams.ts +0 -18
  295. package/src/app-server/protocol-generated/typescript/v2/FsWriteFileResponse.ts +0 -8
  296. package/src/app-server/protocol-generated/typescript/v2/GetAccountParams.ts +0 -14
  297. package/src/app-server/protocol-generated/typescript/v2/GetAccountRateLimitsResponse.ts +0 -15
  298. package/src/app-server/protocol-generated/typescript/v2/GetAccountResponse.ts +0 -6
  299. package/src/app-server/protocol-generated/typescript/v2/GitInfo.ts +0 -5
  300. package/src/app-server/protocol-generated/typescript/v2/GrantedPermissionProfile.ts +0 -10
  301. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReview.ts +0 -18
  302. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReviewAction.ts +0 -34
  303. package/src/app-server/protocol-generated/typescript/v2/GuardianApprovalReviewStatus.ts +0 -13
  304. package/src/app-server/protocol-generated/typescript/v2/GuardianCommandSource.ts +0 -5
  305. package/src/app-server/protocol-generated/typescript/v2/GuardianRiskLevel.ts +0 -8
  306. package/src/app-server/protocol-generated/typescript/v2/GuardianUserAuthorization.ts +0 -8
  307. package/src/app-server/protocol-generated/typescript/v2/GuardianWarningNotification.ts +0 -14
  308. package/src/app-server/protocol-generated/typescript/v2/HookCompletedNotification.ts +0 -10
  309. package/src/app-server/protocol-generated/typescript/v2/HookEventName.ts +0 -11
  310. package/src/app-server/protocol-generated/typescript/v2/HookExecutionMode.ts +0 -5
  311. package/src/app-server/protocol-generated/typescript/v2/HookHandlerType.ts +0 -5
  312. package/src/app-server/protocol-generated/typescript/v2/HookOutputEntry.ts +0 -6
  313. package/src/app-server/protocol-generated/typescript/v2/HookOutputEntryKind.ts +0 -5
  314. package/src/app-server/protocol-generated/typescript/v2/HookPromptFragment.ts +0 -5
  315. package/src/app-server/protocol-generated/typescript/v2/HookRunStatus.ts +0 -5
  316. package/src/app-server/protocol-generated/typescript/v2/HookRunSummary.ts +0 -28
  317. package/src/app-server/protocol-generated/typescript/v2/HookScope.ts +0 -5
  318. package/src/app-server/protocol-generated/typescript/v2/HookSource.ts +0 -13
  319. package/src/app-server/protocol-generated/typescript/v2/HookStartedNotification.ts +0 -10
  320. package/src/app-server/protocol-generated/typescript/v2/ItemCompletedNotification.ts +0 -6
  321. package/src/app-server/protocol-generated/typescript/v2/ItemGuardianApprovalReviewCompletedNotification.ts +0 -36
  322. package/src/app-server/protocol-generated/typescript/v2/ItemGuardianApprovalReviewStartedNotification.ts +0 -34
  323. package/src/app-server/protocol-generated/typescript/v2/ItemStartedNotification.ts +0 -6
  324. package/src/app-server/protocol-generated/typescript/v2/ListMcpServerStatusParams.ts +0 -20
  325. package/src/app-server/protocol-generated/typescript/v2/ListMcpServerStatusResponse.ts +0 -13
  326. package/src/app-server/protocol-generated/typescript/v2/LoginAccountParams.ts +0 -27
  327. package/src/app-server/protocol-generated/typescript/v2/LoginAccountResponse.ts +0 -27
  328. package/src/app-server/protocol-generated/typescript/v2/LogoutAccountResponse.ts +0 -5
  329. package/src/app-server/protocol-generated/typescript/v2/ManagedHooksRequirements.ts +0 -15
  330. package/src/app-server/protocol-generated/typescript/v2/MarketplaceAddParams.ts +0 -9
  331. package/src/app-server/protocol-generated/typescript/v2/MarketplaceAddResponse.ts +0 -10
  332. package/src/app-server/protocol-generated/typescript/v2/MarketplaceInterface.ts +0 -5
  333. package/src/app-server/protocol-generated/typescript/v2/MarketplaceLoadErrorInfo.ts +0 -6
  334. package/src/app-server/protocol-generated/typescript/v2/MarketplaceRemoveParams.ts +0 -5
  335. package/src/app-server/protocol-generated/typescript/v2/MarketplaceRemoveResponse.ts +0 -9
  336. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeErrorInfo.ts +0 -5
  337. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeParams.ts +0 -5
  338. package/src/app-server/protocol-generated/typescript/v2/MarketplaceUpgradeResponse.ts +0 -11
  339. package/src/app-server/protocol-generated/typescript/v2/McpAuthStatus.ts +0 -5
  340. package/src/app-server/protocol-generated/typescript/v2/McpElicitationArrayType.ts +0 -5
  341. package/src/app-server/protocol-generated/typescript/v2/McpElicitationBooleanSchema.ts +0 -11
  342. package/src/app-server/protocol-generated/typescript/v2/McpElicitationBooleanType.ts +0 -5
  343. package/src/app-server/protocol-generated/typescript/v2/McpElicitationConstOption.ts +0 -5
  344. package/src/app-server/protocol-generated/typescript/v2/McpElicitationEnumSchema.ts +0 -11
  345. package/src/app-server/protocol-generated/typescript/v2/McpElicitationLegacyTitledEnumSchema.ts +0 -13
  346. package/src/app-server/protocol-generated/typescript/v2/McpElicitationMultiSelectEnumSchema.ts +0 -9
  347. package/src/app-server/protocol-generated/typescript/v2/McpElicitationNumberSchema.ts +0 -13
  348. package/src/app-server/protocol-generated/typescript/v2/McpElicitationNumberType.ts +0 -5
  349. package/src/app-server/protocol-generated/typescript/v2/McpElicitationObjectType.ts +0 -5
  350. package/src/app-server/protocol-generated/typescript/v2/McpElicitationPrimitiveSchema.ts +0 -13
  351. package/src/app-server/protocol-generated/typescript/v2/McpElicitationSchema.ts +0 -18
  352. package/src/app-server/protocol-generated/typescript/v2/McpElicitationSingleSelectEnumSchema.ts +0 -9
  353. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringFormat.ts +0 -5
  354. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringSchema.ts +0 -15
  355. package/src/app-server/protocol-generated/typescript/v2/McpElicitationStringType.ts +0 -5
  356. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledEnumItems.ts +0 -6
  357. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledMultiSelectEnumSchema.ts +0 -15
  358. package/src/app-server/protocol-generated/typescript/v2/McpElicitationTitledSingleSelectEnumSchema.ts +0 -13
  359. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledEnumItems.ts +0 -9
  360. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledMultiSelectEnumSchema.ts +0 -15
  361. package/src/app-server/protocol-generated/typescript/v2/McpElicitationUntitledSingleSelectEnumSchema.ts +0 -12
  362. package/src/app-server/protocol-generated/typescript/v2/McpResourceReadParams.ts +0 -5
  363. package/src/app-server/protocol-generated/typescript/v2/McpResourceReadResponse.ts +0 -6
  364. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationAction.ts +0 -5
  365. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationRequestParams.ts +0 -27
  366. package/src/app-server/protocol-generated/typescript/v2/McpServerElicitationRequestResponse.ts +0 -19
  367. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginCompletedNotification.ts +0 -9
  368. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginParams.ts +0 -9
  369. package/src/app-server/protocol-generated/typescript/v2/McpServerOauthLoginResponse.ts +0 -5
  370. package/src/app-server/protocol-generated/typescript/v2/McpServerRefreshResponse.ts +0 -5
  371. package/src/app-server/protocol-generated/typescript/v2/McpServerStartupState.ts +0 -5
  372. package/src/app-server/protocol-generated/typescript/v2/McpServerStatus.ts +0 -15
  373. package/src/app-server/protocol-generated/typescript/v2/McpServerStatusDetail.ts +0 -5
  374. package/src/app-server/protocol-generated/typescript/v2/McpServerStatusUpdatedNotification.ts +0 -10
  375. package/src/app-server/protocol-generated/typescript/v2/McpServerToolCallParams.ts +0 -12
  376. package/src/app-server/protocol-generated/typescript/v2/McpServerToolCallResponse.ts +0 -11
  377. package/src/app-server/protocol-generated/typescript/v2/McpToolCallError.ts +0 -5
  378. package/src/app-server/protocol-generated/typescript/v2/McpToolCallProgressNotification.ts +0 -10
  379. package/src/app-server/protocol-generated/typescript/v2/McpToolCallResult.ts +0 -10
  380. package/src/app-server/protocol-generated/typescript/v2/McpToolCallStatus.ts +0 -5
  381. package/src/app-server/protocol-generated/typescript/v2/MemoryCitation.ts +0 -6
  382. package/src/app-server/protocol-generated/typescript/v2/MemoryCitationEntry.ts +0 -10
  383. package/src/app-server/protocol-generated/typescript/v2/MergeStrategy.ts +0 -5
  384. package/src/app-server/protocol-generated/typescript/v2/MigrationDetails.ts +0 -6
  385. package/src/app-server/protocol-generated/typescript/v2/Model.ts +0 -25
  386. package/src/app-server/protocol-generated/typescript/v2/ModelAvailabilityNux.ts +0 -5
  387. package/src/app-server/protocol-generated/typescript/v2/ModelListParams.ts +0 -18
  388. package/src/app-server/protocol-generated/typescript/v2/ModelListResponse.ts +0 -13
  389. package/src/app-server/protocol-generated/typescript/v2/ModelRerouteReason.ts +0 -5
  390. package/src/app-server/protocol-generated/typescript/v2/ModelReroutedNotification.ts +0 -12
  391. package/src/app-server/protocol-generated/typescript/v2/ModelUpgradeInfo.ts +0 -10
  392. package/src/app-server/protocol-generated/typescript/v2/ModelVerification.ts +0 -5
  393. package/src/app-server/protocol-generated/typescript/v2/ModelVerificationNotification.ts +0 -10
  394. package/src/app-server/protocol-generated/typescript/v2/NetworkAccess.ts +0 -5
  395. package/src/app-server/protocol-generated/typescript/v2/NetworkApprovalContext.ts +0 -6
  396. package/src/app-server/protocol-generated/typescript/v2/NetworkApprovalProtocol.ts +0 -5
  397. package/src/app-server/protocol-generated/typescript/v2/NetworkDomainPermission.ts +0 -5
  398. package/src/app-server/protocol-generated/typescript/v2/NetworkPolicyAmendment.ts +0 -6
  399. package/src/app-server/protocol-generated/typescript/v2/NetworkPolicyRuleAction.ts +0 -5
  400. package/src/app-server/protocol-generated/typescript/v2/NetworkRequirements.ts +0 -40
  401. package/src/app-server/protocol-generated/typescript/v2/NetworkUnixSocketPermission.ts +0 -5
  402. package/src/app-server/protocol-generated/typescript/v2/NonSteerableTurnKind.ts +0 -5
  403. package/src/app-server/protocol-generated/typescript/v2/OverriddenMetadata.ts +0 -11
  404. package/src/app-server/protocol-generated/typescript/v2/PatchApplyStatus.ts +0 -5
  405. package/src/app-server/protocol-generated/typescript/v2/PatchChangeKind.ts +0 -8
  406. package/src/app-server/protocol-generated/typescript/v2/PermissionGrantScope.ts +0 -5
  407. package/src/app-server/protocol-generated/typescript/v2/PermissionProfile.ts +0 -10
  408. package/src/app-server/protocol-generated/typescript/v2/PermissionProfileFileSystemPermissions.ts +0 -9
  409. package/src/app-server/protocol-generated/typescript/v2/PermissionProfileNetworkPermissions.ts +0 -5
  410. package/src/app-server/protocol-generated/typescript/v2/PermissionsRequestApprovalParams.ts +0 -14
  411. package/src/app-server/protocol-generated/typescript/v2/PermissionsRequestApprovalResponse.ts +0 -14
  412. package/src/app-server/protocol-generated/typescript/v2/PlanDeltaNotification.ts +0 -14
  413. package/src/app-server/protocol-generated/typescript/v2/PluginAuthPolicy.ts +0 -5
  414. package/src/app-server/protocol-generated/typescript/v2/PluginDetail.ts +0 -17
  415. package/src/app-server/protocol-generated/typescript/v2/PluginInstallParams.ts +0 -10
  416. package/src/app-server/protocol-generated/typescript/v2/PluginInstallPolicy.ts +0 -5
  417. package/src/app-server/protocol-generated/typescript/v2/PluginInstallResponse.ts +0 -10
  418. package/src/app-server/protocol-generated/typescript/v2/PluginInterface.ts +0 -46
  419. package/src/app-server/protocol-generated/typescript/v2/PluginListParams.ts +0 -12
  420. package/src/app-server/protocol-generated/typescript/v2/PluginListResponse.ts +0 -11
  421. package/src/app-server/protocol-generated/typescript/v2/PluginMarketplaceEntry.ts +0 -17
  422. package/src/app-server/protocol-generated/typescript/v2/PluginReadParams.ts +0 -10
  423. package/src/app-server/protocol-generated/typescript/v2/PluginReadResponse.ts +0 -6
  424. package/src/app-server/protocol-generated/typescript/v2/PluginSource.ts +0 -9
  425. package/src/app-server/protocol-generated/typescript/v2/PluginSummary.ts +0 -18
  426. package/src/app-server/protocol-generated/typescript/v2/PluginUninstallParams.ts +0 -5
  427. package/src/app-server/protocol-generated/typescript/v2/PluginUninstallResponse.ts +0 -5
  428. package/src/app-server/protocol-generated/typescript/v2/PluginsMigration.ts +0 -5
  429. package/src/app-server/protocol-generated/typescript/v2/ProfileV2.ts +0 -38
  430. package/src/app-server/protocol-generated/typescript/v2/RateLimitReachedType.ts +0 -10
  431. package/src/app-server/protocol-generated/typescript/v2/RateLimitSnapshot.ts +0 -17
  432. package/src/app-server/protocol-generated/typescript/v2/RateLimitWindow.ts +0 -9
  433. package/src/app-server/protocol-generated/typescript/v2/RawResponseItemCompletedNotification.ts +0 -10
  434. package/src/app-server/protocol-generated/typescript/v2/ReadOnlyAccess.ts +0 -8
  435. package/src/app-server/protocol-generated/typescript/v2/ReasoningEffortOption.ts +0 -6
  436. package/src/app-server/protocol-generated/typescript/v2/ReasoningSummaryPartAddedNotification.ts +0 -10
  437. package/src/app-server/protocol-generated/typescript/v2/ReasoningSummaryTextDeltaNotification.ts +0 -11
  438. package/src/app-server/protocol-generated/typescript/v2/ReasoningTextDeltaNotification.ts +0 -11
  439. package/src/app-server/protocol-generated/typescript/v2/RemoteControlClientConnectionAudience.ts +0 -8
  440. package/src/app-server/protocol-generated/typescript/v2/RemoteControlClientEnrollmentAudience.ts +0 -8
  441. package/src/app-server/protocol-generated/typescript/v2/RequestPermissionProfile.ts +0 -10
  442. package/src/app-server/protocol-generated/typescript/v2/ResidencyRequirement.ts +0 -5
  443. package/src/app-server/protocol-generated/typescript/v2/ReviewDelivery.ts +0 -5
  444. package/src/app-server/protocol-generated/typescript/v2/ReviewStartParams.ts +0 -15
  445. package/src/app-server/protocol-generated/typescript/v2/ReviewStartResponse.ts +0 -15
  446. package/src/app-server/protocol-generated/typescript/v2/ReviewTarget.ts +0 -16
  447. package/src/app-server/protocol-generated/typescript/v2/SandboxMode.ts +0 -5
  448. package/src/app-server/protocol-generated/typescript/v2/SandboxPolicy.ts +0 -19
  449. package/src/app-server/protocol-generated/typescript/v2/SandboxWorkspaceWrite.ts +0 -10
  450. package/src/app-server/protocol-generated/typescript/v2/SendAddCreditsNudgeEmailParams.ts +0 -6
  451. package/src/app-server/protocol-generated/typescript/v2/SendAddCreditsNudgeEmailResponse.ts +0 -6
  452. package/src/app-server/protocol-generated/typescript/v2/ServerRequestResolvedNotification.ts +0 -6
  453. package/src/app-server/protocol-generated/typescript/v2/SessionSource.ts +0 -13
  454. package/src/app-server/protocol-generated/typescript/v2/SkillDependencies.ts +0 -6
  455. package/src/app-server/protocol-generated/typescript/v2/SkillErrorInfo.ts +0 -5
  456. package/src/app-server/protocol-generated/typescript/v2/SkillInterface.ts +0 -13
  457. package/src/app-server/protocol-generated/typescript/v2/SkillMetadata.ts +0 -21
  458. package/src/app-server/protocol-generated/typescript/v2/SkillScope.ts +0 -5
  459. package/src/app-server/protocol-generated/typescript/v2/SkillSummary.ts +0 -14
  460. package/src/app-server/protocol-generated/typescript/v2/SkillToolDependency.ts +0 -12
  461. package/src/app-server/protocol-generated/typescript/v2/SkillsChangedNotification.ts +0 -11
  462. package/src/app-server/protocol-generated/typescript/v2/SkillsConfigWriteParams.ts +0 -16
  463. package/src/app-server/protocol-generated/typescript/v2/SkillsConfigWriteResponse.ts +0 -5
  464. package/src/app-server/protocol-generated/typescript/v2/SkillsListEntry.ts +0 -11
  465. package/src/app-server/protocol-generated/typescript/v2/SkillsListExtraRootsForCwd.ts +0 -5
  466. package/src/app-server/protocol-generated/typescript/v2/SkillsListParams.ts +0 -19
  467. package/src/app-server/protocol-generated/typescript/v2/SkillsListResponse.ts +0 -6
  468. package/src/app-server/protocol-generated/typescript/v2/SortDirection.ts +0 -5
  469. package/src/app-server/protocol-generated/typescript/v2/TerminalInteractionNotification.ts +0 -11
  470. package/src/app-server/protocol-generated/typescript/v2/TextElement.ts +0 -15
  471. package/src/app-server/protocol-generated/typescript/v2/TextPosition.ts +0 -14
  472. package/src/app-server/protocol-generated/typescript/v2/TextRange.ts +0 -6
  473. package/src/app-server/protocol-generated/typescript/v2/Thread.ts +0 -79
  474. package/src/app-server/protocol-generated/typescript/v2/ThreadActiveFlag.ts +0 -5
  475. package/src/app-server/protocol-generated/typescript/v2/ThreadApproveGuardianDeniedActionParams.ts +0 -12
  476. package/src/app-server/protocol-generated/typescript/v2/ThreadApproveGuardianDeniedActionResponse.ts +0 -5
  477. package/src/app-server/protocol-generated/typescript/v2/ThreadArchiveParams.ts +0 -5
  478. package/src/app-server/protocol-generated/typescript/v2/ThreadArchiveResponse.ts +0 -5
  479. package/src/app-server/protocol-generated/typescript/v2/ThreadArchivedNotification.ts +0 -5
  480. package/src/app-server/protocol-generated/typescript/v2/ThreadClosedNotification.ts +0 -5
  481. package/src/app-server/protocol-generated/typescript/v2/ThreadCompactStartParams.ts +0 -5
  482. package/src/app-server/protocol-generated/typescript/v2/ThreadCompactStartResponse.ts +0 -5
  483. package/src/app-server/protocol-generated/typescript/v2/ThreadForkParams.ts +0 -55
  484. package/src/app-server/protocol-generated/typescript/v2/ThreadForkResponse.ts +0 -41
  485. package/src/app-server/protocol-generated/typescript/v2/ThreadInjectItemsParams.ts +0 -12
  486. package/src/app-server/protocol-generated/typescript/v2/ThreadInjectItemsResponse.ts +0 -5
  487. package/src/app-server/protocol-generated/typescript/v2/ThreadItem.ts +0 -156
  488. package/src/app-server/protocol-generated/typescript/v2/ThreadListParams.ts +0 -55
  489. package/src/app-server/protocol-generated/typescript/v2/ThreadListResponse.ts +0 -20
  490. package/src/app-server/protocol-generated/typescript/v2/ThreadLoadedListParams.ts +0 -14
  491. package/src/app-server/protocol-generated/typescript/v2/ThreadLoadedListResponse.ts +0 -15
  492. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataGitInfoUpdateParams.ts +0 -21
  493. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataUpdateParams.ts +0 -14
  494. package/src/app-server/protocol-generated/typescript/v2/ThreadMetadataUpdateResponse.ts +0 -6
  495. package/src/app-server/protocol-generated/typescript/v2/ThreadNameUpdatedNotification.ts +0 -5
  496. package/src/app-server/protocol-generated/typescript/v2/ThreadReadParams.ts +0 -11
  497. package/src/app-server/protocol-generated/typescript/v2/ThreadReadResponse.ts +0 -6
  498. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeAudioChunk.ts +0 -14
  499. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeClosedNotification.ts +0 -8
  500. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeErrorNotification.ts +0 -8
  501. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeItemAddedNotification.ts +0 -9
  502. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeOutputAudioDeltaNotification.ts +0 -12
  503. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeSdpNotification.ts +0 -8
  504. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeStartTransport.ts +0 -17
  505. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeStartedNotification.ts +0 -13
  506. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeTranscriptDeltaNotification.ts +0 -16
  507. package/src/app-server/protocol-generated/typescript/v2/ThreadRealtimeTranscriptDoneNotification.ts +0 -16
  508. package/src/app-server/protocol-generated/typescript/v2/ThreadResumeParams.ts +0 -64
  509. package/src/app-server/protocol-generated/typescript/v2/ThreadResumeResponse.ts +0 -41
  510. package/src/app-server/protocol-generated/typescript/v2/ThreadRollbackParams.ts +0 -14
  511. package/src/app-server/protocol-generated/typescript/v2/ThreadRollbackResponse.ts +0 -15
  512. package/src/app-server/protocol-generated/typescript/v2/ThreadSetNameParams.ts +0 -5
  513. package/src/app-server/protocol-generated/typescript/v2/ThreadSetNameResponse.ts +0 -5
  514. package/src/app-server/protocol-generated/typescript/v2/ThreadShellCommandParams.ts +0 -14
  515. package/src/app-server/protocol-generated/typescript/v2/ThreadShellCommandResponse.ts +0 -5
  516. package/src/app-server/protocol-generated/typescript/v2/ThreadSortKey.ts +0 -5
  517. package/src/app-server/protocol-generated/typescript/v2/ThreadSourceKind.ts +0 -15
  518. package/src/app-server/protocol-generated/typescript/v2/ThreadStartParams.ts +0 -43
  519. package/src/app-server/protocol-generated/typescript/v2/ThreadStartResponse.ts +0 -41
  520. package/src/app-server/protocol-generated/typescript/v2/ThreadStartSource.ts +0 -5
  521. package/src/app-server/protocol-generated/typescript/v2/ThreadStartedNotification.ts +0 -6
  522. package/src/app-server/protocol-generated/typescript/v2/ThreadStatus.ts +0 -10
  523. package/src/app-server/protocol-generated/typescript/v2/ThreadStatusChangedNotification.ts +0 -6
  524. package/src/app-server/protocol-generated/typescript/v2/ThreadTokenUsage.ts +0 -10
  525. package/src/app-server/protocol-generated/typescript/v2/ThreadTokenUsageUpdatedNotification.ts +0 -10
  526. package/src/app-server/protocol-generated/typescript/v2/ThreadTurnsListParams.ts +0 -20
  527. package/src/app-server/protocol-generated/typescript/v2/ThreadTurnsListResponse.ts +0 -20
  528. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchiveParams.ts +0 -5
  529. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchiveResponse.ts +0 -6
  530. package/src/app-server/protocol-generated/typescript/v2/ThreadUnarchivedNotification.ts +0 -5
  531. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeParams.ts +0 -5
  532. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeResponse.ts +0 -6
  533. package/src/app-server/protocol-generated/typescript/v2/ThreadUnsubscribeStatus.ts +0 -5
  534. package/src/app-server/protocol-generated/typescript/v2/TokenUsageBreakdown.ts +0 -11
  535. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputAnswer.ts +0 -8
  536. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputOption.ts +0 -8
  537. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputParams.ts +0 -14
  538. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputQuestion.ts +0 -16
  539. package/src/app-server/protocol-generated/typescript/v2/ToolRequestUserInputResponse.ts +0 -11
  540. package/src/app-server/protocol-generated/typescript/v2/ToolsV2.ts +0 -6
  541. package/src/app-server/protocol-generated/typescript/v2/Turn.ts +0 -33
  542. package/src/app-server/protocol-generated/typescript/v2/TurnCompletedNotification.ts +0 -6
  543. package/src/app-server/protocol-generated/typescript/v2/TurnDiffUpdatedNotification.ts +0 -9
  544. package/src/app-server/protocol-generated/typescript/v2/TurnEnvironmentParams.ts +0 -6
  545. package/src/app-server/protocol-generated/typescript/v2/TurnError.ts +0 -10
  546. package/src/app-server/protocol-generated/typescript/v2/TurnInterruptParams.ts +0 -5
  547. package/src/app-server/protocol-generated/typescript/v2/TurnInterruptResponse.ts +0 -5
  548. package/src/app-server/protocol-generated/typescript/v2/TurnPlanStep.ts +0 -6
  549. package/src/app-server/protocol-generated/typescript/v2/TurnPlanStepStatus.ts +0 -5
  550. package/src/app-server/protocol-generated/typescript/v2/TurnPlanUpdatedNotification.ts +0 -11
  551. package/src/app-server/protocol-generated/typescript/v2/TurnStartParams.ts +0 -62
  552. package/src/app-server/protocol-generated/typescript/v2/TurnStartResponse.ts +0 -6
  553. package/src/app-server/protocol-generated/typescript/v2/TurnStartedNotification.ts +0 -6
  554. package/src/app-server/protocol-generated/typescript/v2/TurnStatus.ts +0 -5
  555. package/src/app-server/protocol-generated/typescript/v2/TurnSteerParams.ts +0 -13
  556. package/src/app-server/protocol-generated/typescript/v2/TurnSteerResponse.ts +0 -5
  557. package/src/app-server/protocol-generated/typescript/v2/UserInput.ts +0 -18
  558. package/src/app-server/protocol-generated/typescript/v2/WarningNotification.ts +0 -14
  559. package/src/app-server/protocol-generated/typescript/v2/WebSearchAction.ts +0 -9
  560. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupCompletedNotification.ts +0 -10
  561. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupMode.ts +0 -5
  562. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupStartParams.ts +0 -10
  563. package/src/app-server/protocol-generated/typescript/v2/WindowsSandboxSetupStartResponse.ts +0 -5
  564. package/src/app-server/protocol-generated/typescript/v2/WindowsWorldWritableWarningNotification.ts +0 -9
  565. package/src/app-server/protocol-generated/typescript/v2/WriteStatus.ts +0 -5
  566. package/src/app-server/protocol-generated/typescript/v2/index.ts +0 -410
  567. package/src/app-server/protocol-validators.ts +0 -167
  568. package/src/app-server/protocol.ts +0 -110
  569. package/src/app-server/request.ts +0 -45
  570. package/src/app-server/run-attempt.context-engine.test.ts +0 -423
  571. package/src/app-server/run-attempt.test.ts +0 -2354
  572. package/src/app-server/run-attempt.ts +0 -1671
  573. package/src/app-server/run-attempt.vision-tools.test.ts +0 -35
  574. package/src/app-server/schema-normalization-runtime-contract.test.ts +0 -169
  575. package/src/app-server/session-binding.test.ts +0 -52
  576. package/src/app-server/session-binding.ts +0 -131
  577. package/src/app-server/session-history.ts +0 -40
  578. package/src/app-server/shared-client.test.ts +0 -396
  579. package/src/app-server/shared-client.ts +0 -174
  580. package/src/app-server/test-support.ts +0 -48
  581. package/src/app-server/thread-lifecycle.test.ts +0 -59
  582. package/src/app-server/thread-lifecycle.ts +0 -336
  583. package/src/app-server/timeout.ts +0 -22
  584. package/src/app-server/trajectory.test.ts +0 -155
  585. package/src/app-server/trajectory.ts +0 -433
  586. package/src/app-server/transcript-mirror.test.ts +0 -265
  587. package/src/app-server/transcript-mirror.ts +0 -311
  588. package/src/app-server/transcript-repair-runtime-contract.test.ts +0 -44
  589. package/src/app-server/transport-stdio.test.ts +0 -171
  590. package/src/app-server/transport-stdio.ts +0 -107
  591. package/src/app-server/transport-websocket.test.ts +0 -71
  592. package/src/app-server/transport-websocket.ts +0 -90
  593. package/src/app-server/transport.ts +0 -117
  594. package/src/app-server/user-input-bridge.test.ts +0 -137
  595. package/src/app-server/user-input-bridge.ts +0 -294
  596. package/src/app-server/version.ts +0 -3
  597. package/src/app-server/vision-tools.ts +0 -12
  598. package/src/command-formatters.ts +0 -204
  599. package/src/command-handlers.ts +0 -1559
  600. package/src/command-rpc.test.ts +0 -16
  601. package/src/command-rpc.ts +0 -97
  602. package/src/commands.test.ts +0 -1716
  603. package/src/commands.ts +0 -32
  604. package/src/conversation-binding-data.ts +0 -72
  605. package/src/conversation-binding.test.ts +0 -76
  606. package/src/conversation-binding.ts +0 -351
  607. package/src/conversation-control.test.ts +0 -50
  608. package/src/conversation-control.ts +0 -255
  609. package/src/conversation-turn-collector.test.ts +0 -154
  610. package/src/conversation-turn-collector.ts +0 -158
  611. package/src/conversation-turn-input.test.ts +0 -44
  612. package/src/conversation-turn-input.ts +0 -80
  613. package/src/manifest.test.ts +0 -20
  614. package/src/migration/apply.ts +0 -43
  615. package/src/migration/helpers.ts +0 -60
  616. package/src/migration/plan.ts +0 -148
  617. package/src/migration/provider.test.ts +0 -219
  618. package/src/migration/provider.ts +0 -28
  619. package/src/migration/source.ts +0 -176
  620. package/src/migration/targets.ts +0 -25
  621. package/test-api.ts +0 -79
  622. package/tsconfig.json +0 -16
@@ -1,2354 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { SessionManager } from "@mariozechner/pi-coding-agent";
5
- import {
6
- abortAgentHarnessRun,
7
- queueAgentHarnessMessage,
8
- type EmbeddedRunAttemptParams,
9
- } from "openclaw/plugin-sdk/agent-harness";
10
- import {
11
- buildAgentRuntimePlan,
12
- embeddedAgentLog,
13
- nativeHookRelayTesting,
14
- onAgentEvent,
15
- resetAgentEventsForTest,
16
- type AgentEventPayload,
17
- } from "openclaw/plugin-sdk/agent-harness-runtime";
18
- import {
19
- initializeGlobalHookRunner,
20
- resetGlobalHookRunner,
21
- } from "openclaw/plugin-sdk/hook-runtime";
22
- import { createMockPluginRegistry } from "openclaw/plugin-sdk/plugin-test-runtime";
23
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
24
- import { CODEX_GPT5_BEHAVIOR_CONTRACT } from "../../prompt-overlay.js";
25
- import * as elicitationBridge from "./elicitation-bridge.js";
26
- import type { CodexServerNotification } from "./protocol.js";
27
- import { runCodexAppServerAttempt, __testing } from "./run-attempt.js";
28
- import { readCodexAppServerBinding, writeCodexAppServerBinding } from "./session-binding.js";
29
- import { createCodexTestModel } from "./test-support.js";
30
- import {
31
- buildThreadResumeParams,
32
- buildTurnStartParams,
33
- startOrResumeThread,
34
- } from "./thread-lifecycle.js";
35
-
36
- let tempDir: string;
37
-
38
- function createParams(sessionFile: string, workspaceDir: string): EmbeddedRunAttemptParams {
39
- return {
40
- prompt: "hello",
41
- sessionId: "session-1",
42
- sessionKey: "agent:main:session-1",
43
- sessionFile,
44
- workspaceDir,
45
- runId: "run-1",
46
- provider: "codex",
47
- modelId: "gpt-5.4-codex",
48
- model: createCodexTestModel("codex"),
49
- thinkLevel: "medium",
50
- disableTools: true,
51
- timeoutMs: 5_000,
52
- authStorage: {} as never,
53
- authProfileStore: { version: 1, profiles: {} },
54
- modelRegistry: {} as never,
55
- } as EmbeddedRunAttemptParams;
56
- }
57
-
58
- function createParamsWithRuntimePlan(
59
- sessionFile: string,
60
- workspaceDir: string,
61
- ): EmbeddedRunAttemptParams {
62
- const params = createParams(sessionFile, workspaceDir);
63
- return {
64
- ...params,
65
- runtimePlan: buildAgentRuntimePlan({
66
- provider: params.provider,
67
- modelId: params.modelId,
68
- model: params.model,
69
- modelApi: params.model.api,
70
- harnessId: "codex",
71
- harnessRuntime: "codex",
72
- config: params.config,
73
- workspaceDir,
74
- agentDir: tempDir,
75
- thinkingLevel: params.thinkLevel,
76
- }),
77
- } as EmbeddedRunAttemptParams;
78
- }
79
-
80
- function threadStartResult(threadId = "thread-1") {
81
- return {
82
- thread: {
83
- id: threadId,
84
- forkedFromId: null,
85
- preview: "",
86
- ephemeral: false,
87
- modelProvider: "openai",
88
- createdAt: 1,
89
- updatedAt: 1,
90
- status: { type: "idle" },
91
- path: null,
92
- cwd: tempDir || "/tmp/openclaw-codex-test",
93
- cliVersion: "0.125.0",
94
- source: "unknown",
95
- agentNickname: null,
96
- agentRole: null,
97
- gitInfo: null,
98
- name: null,
99
- turns: [],
100
- },
101
- model: "gpt-5.4-codex",
102
- modelProvider: "openai",
103
- serviceTier: null,
104
- cwd: tempDir || "/tmp/openclaw-codex-test",
105
- instructionSources: [],
106
- approvalPolicy: "never",
107
- approvalsReviewer: "user",
108
- sandbox: { type: "dangerFullAccess" },
109
- permissionProfile: null,
110
- reasoningEffort: null,
111
- };
112
- }
113
-
114
- function turnStartResult(turnId = "turn-1", status = "inProgress") {
115
- return {
116
- turn: {
117
- id: turnId,
118
- status,
119
- items: [],
120
- error: null,
121
- startedAt: null,
122
- completedAt: null,
123
- durationMs: null,
124
- },
125
- };
126
- }
127
-
128
- function assistantMessage(text: string, timestamp: number) {
129
- return {
130
- role: "assistant" as const,
131
- content: [{ type: "text" as const, text }],
132
- api: "openai-codex-responses",
133
- provider: "openai-codex",
134
- model: "gpt-5.4-codex",
135
- usage: {
136
- input: 0,
137
- output: 0,
138
- cacheRead: 0,
139
- cacheWrite: 0,
140
- totalTokens: 0,
141
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
142
- },
143
- stopReason: "stop" as const,
144
- timestamp,
145
- };
146
- }
147
-
148
- function createAppServerHarness(
149
- requestImpl: (method: string, params: unknown) => Promise<unknown>,
150
- options: {
151
- onStart?: (authProfileId: string | undefined, agentDir: string | undefined) => void;
152
- } = {},
153
- ) {
154
- const requests: Array<{ method: string; params: unknown }> = [];
155
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
156
- const request = vi.fn(async (method: string, params?: unknown) => {
157
- requests.push({ method, params });
158
- return requestImpl(method, params);
159
- });
160
-
161
- __testing.setCodexAppServerClientFactoryForTests(
162
- async (_startOptions, authProfileId, agentDir) => {
163
- options.onStart?.(authProfileId, agentDir);
164
- return {
165
- request,
166
- addNotificationHandler: (handler: typeof notify) => {
167
- notify = handler;
168
- return () => undefined;
169
- },
170
- addRequestHandler: () => () => undefined,
171
- } as never;
172
- },
173
- );
174
-
175
- return {
176
- request,
177
- requests,
178
- async waitForMethod(method: string) {
179
- await vi.waitFor(
180
- () => {
181
- if (!requests.some((entry) => entry.method === method)) {
182
- const mockMethods = request.mock.calls.map((call) => call[0]);
183
- throw new Error(
184
- `expected app-server method ${method}; saw ${requests
185
- .map((entry) => entry.method)
186
- .join(", ")}; mock saw ${mockMethods.join(", ")}`,
187
- );
188
- }
189
- },
190
- { interval: 1, timeout: 30_000 },
191
- );
192
- },
193
- async notify(notification: CodexServerNotification) {
194
- await notify(notification);
195
- },
196
- async completeTurn(params: { threadId: string; turnId: string }) {
197
- await notify({
198
- method: "turn/completed",
199
- params: {
200
- threadId: params.threadId,
201
- turnId: params.turnId,
202
- turn: { id: params.turnId, status: "completed" },
203
- },
204
- });
205
- },
206
- };
207
- }
208
-
209
- function createStartedThreadHarness(
210
- requestImpl: (method: string, params: unknown) => Promise<unknown> = async () => undefined,
211
- options: {
212
- onStart?: (authProfileId: string | undefined, agentDir: string | undefined) => void;
213
- } = {},
214
- ) {
215
- return createAppServerHarness(async (method, params) => {
216
- const override = await requestImpl(method, params);
217
- if (override !== undefined) {
218
- return override;
219
- }
220
- if (method === "thread/start") {
221
- return threadStartResult();
222
- }
223
- if (method === "turn/start") {
224
- return turnStartResult();
225
- }
226
- return {};
227
- }, options);
228
- }
229
-
230
- function expectResumeRequest(
231
- requests: Array<{ method: string; params: unknown }>,
232
- params: Record<string, unknown>,
233
- ) {
234
- expect(requests).toEqual(
235
- expect.arrayContaining([
236
- {
237
- method: "thread/resume",
238
- params: expect.objectContaining(params),
239
- },
240
- ]),
241
- );
242
- }
243
-
244
- function createResumeHarness() {
245
- return createAppServerHarness(async (method) => {
246
- if (method === "thread/resume") {
247
- return threadStartResult("thread-existing");
248
- }
249
- if (method === "turn/start") {
250
- return turnStartResult();
251
- }
252
- return {};
253
- });
254
- }
255
-
256
- async function writeExistingBinding(
257
- sessionFile: string,
258
- workspaceDir: string,
259
- overrides: Partial<Parameters<typeof writeCodexAppServerBinding>[1]> = {},
260
- ) {
261
- await writeCodexAppServerBinding(sessionFile, {
262
- threadId: "thread-existing",
263
- cwd: workspaceDir,
264
- model: "gpt-5.4-codex",
265
- modelProvider: "openai",
266
- ...overrides,
267
- });
268
- }
269
-
270
- function createThreadLifecycleAppServerOptions(): Parameters<
271
- typeof startOrResumeThread
272
- >[0]["appServer"] {
273
- return {
274
- start: {
275
- transport: "stdio",
276
- command: "codex",
277
- args: ["app-server"],
278
- headers: {},
279
- },
280
- requestTimeoutMs: 60_000,
281
- approvalPolicy: "never",
282
- approvalsReviewer: "user",
283
- sandbox: "workspace-write",
284
- };
285
- }
286
-
287
- function createMessageDynamicTool(
288
- description: string,
289
- actions: string[] = ["send"],
290
- ): Parameters<typeof startOrResumeThread>[0]["dynamicTools"][number] {
291
- return {
292
- name: "message",
293
- description,
294
- inputSchema: {
295
- type: "object",
296
- properties: {
297
- action: {
298
- type: "string",
299
- enum: actions,
300
- },
301
- },
302
- required: ["action"],
303
- additionalProperties: false,
304
- },
305
- };
306
- }
307
-
308
- function createNamedDynamicTool(
309
- name: string,
310
- ): Parameters<typeof startOrResumeThread>[0]["dynamicTools"][number] {
311
- return {
312
- name,
313
- description: `${name} test tool`,
314
- inputSchema: {
315
- type: "object",
316
- properties: {},
317
- additionalProperties: false,
318
- },
319
- };
320
- }
321
-
322
- function extractRelayIdFromThreadRequest(params: unknown): string {
323
- const command = (
324
- params as {
325
- config?: {
326
- "hooks.PreToolUse"?: Array<{ hooks?: Array<{ command?: string }> }>;
327
- };
328
- }
329
- ).config?.["hooks.PreToolUse"]?.[0]?.hooks?.[0]?.command;
330
- const match = command?.match(/--relay-id ([^ ]+)/);
331
- if (!match?.[1]) {
332
- throw new Error(`relay id missing from command: ${command}`);
333
- }
334
- return match[1];
335
- }
336
-
337
- describe("runCodexAppServerAttempt", () => {
338
- beforeEach(async () => {
339
- resetAgentEventsForTest();
340
- tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-codex-run-"));
341
- });
342
-
343
- afterEach(async () => {
344
- __testing.resetCodexAppServerClientFactoryForTests();
345
- nativeHookRelayTesting.clearNativeHookRelaysForTests();
346
- resetAgentEventsForTest();
347
- resetGlobalHookRunner();
348
- vi.useRealTimers();
349
- vi.restoreAllMocks();
350
- await fs.rm(tempDir, { recursive: true, force: true });
351
- });
352
-
353
- it("defaults Codex dynamic tools to the native-first profile", () => {
354
- const tools = [
355
- "read",
356
- "write",
357
- "edit",
358
- "apply_patch",
359
- "exec",
360
- "process",
361
- "update_plan",
362
- "web_search",
363
- "message",
364
- "heartbeat_respond",
365
- "sessions_spawn",
366
- ].map((name) => ({ name }));
367
-
368
- expect(__testing.applyCodexDynamicToolProfile(tools, {}).map((tool) => tool.name)).toEqual([
369
- "web_search",
370
- "message",
371
- "heartbeat_respond",
372
- "sessions_spawn",
373
- ]);
374
- });
375
-
376
- it("allows Codex dynamic tool filtering to opt back into OpenClaw compatibility", () => {
377
- const tools = ["read", "exec", "message", "custom_tool"].map((name) => ({ name }));
378
-
379
- expect(
380
- __testing
381
- .applyCodexDynamicToolProfile(tools, {
382
- codexDynamicToolsProfile: "openclaw-compat",
383
- codexDynamicToolsExclude: ["custom_tool"],
384
- })
385
- .map((tool) => tool.name),
386
- ).toEqual(["read", "exec", "message"]);
387
- });
388
-
389
- it("starts Codex threads without duplicate OpenClaw workspace tools by default", async () => {
390
- const sessionFile = path.join(tempDir, "session.jsonl");
391
- const workspaceDir = path.join(tempDir, "workspace");
392
- const appServer = createThreadLifecycleAppServerOptions();
393
- const request = vi.fn(async (method: string, _params: unknown) => {
394
- if (method === "thread/start") {
395
- return threadStartResult();
396
- }
397
- throw new Error(`unexpected method: ${method}`);
398
- });
399
- const dynamicTools = __testing.applyCodexDynamicToolProfile(
400
- [
401
- "read",
402
- "write",
403
- "edit",
404
- "apply_patch",
405
- "exec",
406
- "process",
407
- "update_plan",
408
- "web_search",
409
- "message",
410
- ].map(createNamedDynamicTool),
411
- {},
412
- );
413
-
414
- await startOrResumeThread({
415
- client: { request } as never,
416
- params: createParams(sessionFile, workspaceDir),
417
- cwd: workspaceDir,
418
- dynamicTools,
419
- appServer,
420
- });
421
-
422
- const startRequest = request.mock.calls.find(([method]) => method === "thread/start");
423
- const dynamicToolNames = (
424
- (startRequest?.[1] as { dynamicTools?: Array<{ name: string }> } | undefined)?.dynamicTools ??
425
- []
426
- ).map((tool) => tool.name);
427
-
428
- expect(dynamicToolNames).toContain("message");
429
- expect(dynamicToolNames).toContain("web_search");
430
- expect(dynamicToolNames).not.toEqual(
431
- expect.arrayContaining([
432
- "read",
433
- "write",
434
- "edit",
435
- "apply_patch",
436
- "exec",
437
- "process",
438
- "update_plan",
439
- ]),
440
- );
441
- });
442
-
443
- it("returns a failed dynamic tool response when an app-server tool call exceeds the deadline", async () => {
444
- vi.useFakeTimers();
445
- let capturedSignal: AbortSignal | undefined;
446
- const onTimeout = vi.fn();
447
- const response = __testing.handleDynamicToolCallWithTimeout({
448
- call: {
449
- threadId: "thread-1",
450
- turnId: "turn-1",
451
- callId: "call-timeout",
452
- namespace: null,
453
- tool: "message",
454
- arguments: { action: "send", text: "hello" },
455
- },
456
- toolBridge: {
457
- handleToolCall: vi.fn((_call, options) => {
458
- capturedSignal = options?.signal;
459
- return new Promise<never>(() => undefined);
460
- }),
461
- },
462
- signal: new AbortController().signal,
463
- timeoutMs: 1,
464
- onTimeout,
465
- });
466
-
467
- await vi.advanceTimersByTimeAsync(1);
468
-
469
- await expect(response).resolves.toEqual({
470
- success: false,
471
- contentItems: [
472
- {
473
- type: "inputText",
474
- text: "OpenClaw dynamic tool call timed out after 1ms while running tool message.",
475
- },
476
- ],
477
- });
478
- expect(capturedSignal?.aborted).toBe(true);
479
- expect(onTimeout).toHaveBeenCalledTimes(1);
480
- });
481
-
482
- it("logs process poll timeout context separately from session idle", async () => {
483
- vi.useFakeTimers();
484
- const warn = vi.spyOn(embeddedAgentLog, "warn").mockImplementation(() => undefined);
485
- const response = __testing.handleDynamicToolCallWithTimeout({
486
- call: {
487
- threadId: "thread-1",
488
- turnId: "turn-1",
489
- callId: "call-timeout",
490
- namespace: null,
491
- tool: "process",
492
- arguments: { action: "poll", sessionId: "rapid-crustacean", timeout: 30_000 },
493
- },
494
- toolBridge: {
495
- handleToolCall: vi.fn(() => new Promise<never>(() => undefined)),
496
- },
497
- signal: new AbortController().signal,
498
- timeoutMs: 1,
499
- });
500
-
501
- await vi.advanceTimersByTimeAsync(1);
502
-
503
- await expect(response).resolves.toEqual({
504
- success: false,
505
- contentItems: [
506
- {
507
- type: "inputText",
508
- text: "OpenClaw dynamic tool call timed out after 1ms while waiting for process action=poll sessionId=rapid-crustacean. This is a tool RPC timeout, not a session idle timeout.",
509
- },
510
- ],
511
- });
512
- expect(warn).toHaveBeenCalledWith("codex dynamic tool call timed out", {
513
- tool: "process",
514
- toolCallId: "call-timeout",
515
- threadId: "thread-1",
516
- turnId: "turn-1",
517
- timeoutMs: 1,
518
- timeoutKind: "codex_dynamic_tool_rpc",
519
- processAction: "poll",
520
- processSessionId: "rapid-crustacean",
521
- processRequestedTimeoutMs: 30_000,
522
- consoleMessage:
523
- "codex process tool timeout: action=poll sessionId=rapid-crustacean toolTimeoutMs=1 requestedWaitMs=30000; per-tool-call watchdog, not session idle; repeated lines usually mean process-poll retry churn, not model progress",
524
- });
525
- });
526
-
527
- it("releases the session when Codex never completes after a dynamic tool response", async () => {
528
- let handleRequest:
529
- | ((request: { id: string; method: string; params?: unknown }) => Promise<unknown>)
530
- | undefined;
531
- const request = vi.fn(async (method: string) => {
532
- if (method === "thread/start") {
533
- return threadStartResult("thread-1");
534
- }
535
- if (method === "turn/start") {
536
- return turnStartResult("turn-1", "inProgress");
537
- }
538
- return {};
539
- });
540
- __testing.setCodexAppServerClientFactoryForTests(
541
- async () =>
542
- ({
543
- request,
544
- addNotificationHandler: () => () => undefined,
545
- addRequestHandler: (
546
- handler: (request: {
547
- id: string;
548
- method: string;
549
- params?: unknown;
550
- }) => Promise<unknown>,
551
- ) => {
552
- handleRequest = handler;
553
- return () => undefined;
554
- },
555
- }) as never,
556
- );
557
- const params = createParams(
558
- path.join(tempDir, "session.jsonl"),
559
- path.join(tempDir, "workspace"),
560
- );
561
- params.timeoutMs = 60_000;
562
-
563
- const run = runCodexAppServerAttempt(params, { turnCompletionIdleTimeoutMs: 5 });
564
- await vi.waitFor(() => expect(handleRequest).toBeTypeOf("function"), { interval: 1 });
565
-
566
- await expect(
567
- handleRequest?.({
568
- id: "request-tool-1",
569
- method: "item/tool/call",
570
- params: {
571
- threadId: "thread-1",
572
- turnId: "turn-1",
573
- callId: "call-1",
574
- namespace: null,
575
- tool: "message",
576
- arguments: { action: "send", text: "already sent" },
577
- },
578
- }),
579
- ).resolves.toMatchObject({
580
- success: false,
581
- contentItems: [{ type: "inputText", text: "Unknown OpenClaw tool: message" }],
582
- });
583
-
584
- await expect(run).resolves.toMatchObject({
585
- aborted: true,
586
- timedOut: true,
587
- promptError: "codex app-server turn idle timed out waiting for turn/completed",
588
- });
589
- await vi.waitFor(
590
- () =>
591
- expect(request).toHaveBeenCalledWith("turn/interrupt", {
592
- threadId: "thread-1",
593
- turnId: "turn-1",
594
- }),
595
- { interval: 1 },
596
- );
597
- expect(queueAgentHarnessMessage("session-1", "after timeout")).toBe(false);
598
- });
599
-
600
- it("releases the session when Codex accepts a turn but never sends progress", async () => {
601
- const harness = createStartedThreadHarness();
602
- const params = createParams(
603
- path.join(tempDir, "session.jsonl"),
604
- path.join(tempDir, "workspace"),
605
- );
606
- params.timeoutMs = 60_000;
607
-
608
- const run = runCodexAppServerAttempt(params, { turnTerminalIdleTimeoutMs: 5 });
609
- await harness.waitForMethod("turn/start");
610
-
611
- await expect(run).resolves.toMatchObject({
612
- aborted: true,
613
- timedOut: true,
614
- promptError: "codex app-server turn idle timed out waiting for turn/completed",
615
- });
616
- await vi.waitFor(
617
- () =>
618
- expect(harness.request).toHaveBeenCalledWith("turn/interrupt", {
619
- threadId: "thread-1",
620
- turnId: "turn-1",
621
- }),
622
- { interval: 1 },
623
- );
624
- expect(queueAgentHarnessMessage("session-1", "after silent turn")).toBe(false);
625
- });
626
-
627
- it("applies before_prompt_build to Codex developer instructions and turn input", async () => {
628
- const beforePromptBuild = vi.fn(async () => ({
629
- systemPrompt: "custom codex system",
630
- prependSystemContext: "pre system",
631
- appendSystemContext: "post system",
632
- prependContext: "queued context",
633
- }));
634
- initializeGlobalHookRunner(
635
- createMockPluginRegistry([{ hookName: "before_prompt_build", handler: beforePromptBuild }]),
636
- );
637
- const sessionFile = path.join(tempDir, "session.jsonl");
638
- const workspaceDir = path.join(tempDir, "workspace");
639
- const sessionManager = SessionManager.open(sessionFile);
640
- sessionManager.appendMessage(assistantMessage("previous turn", Date.now()));
641
- const harness = createStartedThreadHarness();
642
-
643
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
644
- await harness.waitForMethod("turn/start");
645
- await new Promise<void>((resolve) => setImmediate(resolve));
646
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
647
- await run;
648
-
649
- expect(beforePromptBuild).toHaveBeenCalledWith(
650
- {
651
- prompt: "hello",
652
- messages: [expect.objectContaining({ role: "assistant" })],
653
- },
654
- expect.objectContaining({
655
- runId: "run-1",
656
- sessionId: "session-1",
657
- }),
658
- );
659
- expect(harness.requests).toEqual(
660
- expect.arrayContaining([
661
- {
662
- method: "thread/start",
663
- params: expect.objectContaining({
664
- developerInstructions: expect.stringContaining("pre system\n\ncustom codex system"),
665
- }),
666
- },
667
- {
668
- method: "turn/start",
669
- params: expect.objectContaining({
670
- input: [{ type: "text", text: "queued context\n\nhello", text_elements: [] }],
671
- }),
672
- },
673
- ]),
674
- );
675
- });
676
-
677
- it("fires llm_input, llm_output, and agent_end hooks for codex turns", async () => {
678
- const llmInput = vi.fn();
679
- const llmOutput = vi.fn();
680
- const agentEnd = vi.fn();
681
- const onRunAgentEvent = vi.fn();
682
- const globalAgentEvents: AgentEventPayload[] = [];
683
- onAgentEvent((event) => globalAgentEvents.push(event));
684
- initializeGlobalHookRunner(
685
- createMockPluginRegistry([
686
- { hookName: "llm_input", handler: llmInput },
687
- { hookName: "llm_output", handler: llmOutput },
688
- { hookName: "agent_end", handler: agentEnd },
689
- ]),
690
- );
691
- const sessionFile = path.join(tempDir, "session.jsonl");
692
- const workspaceDir = path.join(tempDir, "workspace");
693
- const sessionManager = SessionManager.open(sessionFile);
694
- sessionManager.appendMessage(assistantMessage("existing context", Date.now()));
695
- const harness = createStartedThreadHarness();
696
-
697
- const params = createParamsWithRuntimePlan(sessionFile, workspaceDir);
698
- params.onAgentEvent = onRunAgentEvent;
699
- const run = runCodexAppServerAttempt(params);
700
- await harness.waitForMethod("turn/start");
701
- await vi.waitFor(() => expect(llmInput).toHaveBeenCalledTimes(1), { interval: 1 });
702
-
703
- expect(llmInput).toHaveBeenCalledWith(
704
- expect.objectContaining({
705
- runId: "run-1",
706
- sessionId: "session-1",
707
- provider: "codex",
708
- model: "gpt-5.4-codex",
709
- prompt: "hello",
710
- imagesCount: 0,
711
- historyMessages: [expect.objectContaining({ role: "assistant" })],
712
- systemPrompt: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
713
- }),
714
- expect.objectContaining({
715
- runId: "run-1",
716
- sessionId: "session-1",
717
- sessionKey: "agent:main:session-1",
718
- }),
719
- );
720
-
721
- await harness.notify({
722
- method: "item/agentMessage/delta",
723
- params: {
724
- threadId: "thread-1",
725
- turnId: "turn-1",
726
- itemId: "msg-1",
727
- delta: "hello back",
728
- },
729
- });
730
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
731
- const result = await run;
732
-
733
- expect(result.assistantTexts).toEqual(["hello back"]);
734
- await vi.waitFor(() => expect(llmOutput).toHaveBeenCalledTimes(1), { interval: 1 });
735
- await vi.waitFor(() => expect(agentEnd).toHaveBeenCalledTimes(1), { interval: 1 });
736
- const agentEvents = onRunAgentEvent.mock.calls.map(([event]) => event);
737
- expect(agentEvents).toEqual(
738
- expect.arrayContaining([
739
- {
740
- stream: "lifecycle",
741
- data: expect.objectContaining({
742
- phase: "start",
743
- startedAt: expect.any(Number),
744
- }),
745
- },
746
- {
747
- stream: "assistant",
748
- data: { text: "hello back" },
749
- },
750
- {
751
- stream: "lifecycle",
752
- data: expect.objectContaining({
753
- phase: "end",
754
- startedAt: expect.any(Number),
755
- endedAt: expect.any(Number),
756
- }),
757
- },
758
- ]),
759
- );
760
- const startIndex = agentEvents.findIndex(
761
- (event) => event.stream === "lifecycle" && event.data.phase === "start",
762
- );
763
- const assistantIndex = agentEvents.findIndex((event) => event.stream === "assistant");
764
- const endIndex = agentEvents.findIndex(
765
- (event) => event.stream === "lifecycle" && event.data.phase === "end",
766
- );
767
- expect(startIndex).toBeGreaterThanOrEqual(0);
768
- expect(assistantIndex).toBeGreaterThan(startIndex);
769
- expect(endIndex).toBeGreaterThan(assistantIndex);
770
- expect(globalAgentEvents).toEqual(
771
- expect.arrayContaining([
772
- expect.objectContaining({
773
- runId: "run-1",
774
- sessionKey: "agent:main:session-1",
775
- stream: "assistant",
776
- data: { text: "hello back" },
777
- }),
778
- expect.objectContaining({
779
- runId: "run-1",
780
- sessionKey: "agent:main:session-1",
781
- stream: "lifecycle",
782
- data: expect.objectContaining({ phase: "end" }),
783
- }),
784
- ]),
785
- );
786
-
787
- expect(llmOutput).toHaveBeenCalledWith(
788
- expect.objectContaining({
789
- runId: "run-1",
790
- sessionId: "session-1",
791
- provider: "codex",
792
- model: "gpt-5.4-codex",
793
- resolvedRef: "codex/gpt-5.4-codex",
794
- harnessId: "codex",
795
- assistantTexts: ["hello back"],
796
- lastAssistant: expect.objectContaining({
797
- role: "assistant",
798
- }),
799
- }),
800
- expect.objectContaining({
801
- runId: "run-1",
802
- sessionId: "session-1",
803
- }),
804
- );
805
- expect(agentEnd).toHaveBeenCalledWith(
806
- expect.objectContaining({
807
- success: true,
808
- messages: expect.arrayContaining([
809
- expect.objectContaining({ role: "user" }),
810
- expect.objectContaining({ role: "assistant" }),
811
- ]),
812
- }),
813
- expect.objectContaining({
814
- runId: "run-1",
815
- sessionId: "session-1",
816
- }),
817
- );
818
- });
819
-
820
- it("forwards Codex app-server verbose tool summaries and completed output", async () => {
821
- const onToolResult = vi.fn();
822
- const sessionFile = path.join(tempDir, "session.jsonl");
823
- const workspaceDir = path.join(tempDir, "workspace");
824
- const harness = createStartedThreadHarness();
825
- const params = createParams(sessionFile, workspaceDir);
826
- params.verboseLevel = "full";
827
- params.onToolResult = onToolResult;
828
-
829
- const run = runCodexAppServerAttempt(params);
830
- await harness.waitForMethod("turn/start");
831
- await harness.notify({
832
- method: "item/started",
833
- params: {
834
- threadId: "thread-1",
835
- turnId: "turn-1",
836
- item: {
837
- type: "dynamicToolCall",
838
- id: "tool-1",
839
- namespace: null,
840
- tool: "read",
841
- arguments: { path: "README.md" },
842
- status: "inProgress",
843
- contentItems: null,
844
- success: null,
845
- durationMs: null,
846
- },
847
- },
848
- });
849
- await harness.notify({
850
- method: "item/completed",
851
- params: {
852
- threadId: "thread-1",
853
- turnId: "turn-1",
854
- item: {
855
- type: "dynamicToolCall",
856
- id: "tool-1",
857
- namespace: null,
858
- tool: "read",
859
- arguments: { path: "README.md" },
860
- status: "completed",
861
- contentItems: [{ type: "inputText", text: "file contents" }],
862
- success: true,
863
- durationMs: 12,
864
- },
865
- },
866
- });
867
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
868
- await run;
869
-
870
- expect(onToolResult).toHaveBeenCalledTimes(2);
871
- expect(onToolResult).toHaveBeenNthCalledWith(1, {
872
- text: "📖 Read: `from README.md`",
873
- });
874
- expect(onToolResult).toHaveBeenNthCalledWith(2, {
875
- text: "📖 Read: `from README.md`\n```txt\nfile contents\n```",
876
- });
877
- });
878
-
879
- it("registers native hook relay config for an enabled Codex turn and cleans it up", async () => {
880
- const sessionFile = path.join(tempDir, "session.jsonl");
881
- const workspaceDir = path.join(tempDir, "workspace");
882
- const harness = createStartedThreadHarness();
883
-
884
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
885
- nativeHookRelay: {
886
- enabled: true,
887
- events: ["pre_tool_use"],
888
- gatewayTimeoutMs: 4321,
889
- hookTimeoutSec: 9,
890
- },
891
- });
892
- await harness.waitForMethod("turn/start");
893
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
894
- await run;
895
-
896
- const startRequest = harness.requests.find((request) => request.method === "thread/start");
897
- expect(startRequest?.params).toEqual(
898
- expect.objectContaining({
899
- config: expect.objectContaining({
900
- "features.codex_hooks": true,
901
- "hooks.PreToolUse": [
902
- expect.objectContaining({
903
- hooks: [
904
- expect.objectContaining({
905
- type: "command",
906
- timeout: 9,
907
- command: expect.stringContaining("--event pre_tool_use --timeout 4321"),
908
- }),
909
- ],
910
- }),
911
- ],
912
- }),
913
- }),
914
- );
915
- const relayId = extractRelayIdFromThreadRequest(startRequest?.params);
916
- expect(nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(relayId)).toBeUndefined();
917
- });
918
-
919
- it("reuses the Codex native hook relay id across runs for the same session", async () => {
920
- const sessionFile = path.join(tempDir, "session.jsonl");
921
- const workspaceDir = path.join(tempDir, "workspace");
922
- const firstHarness = createStartedThreadHarness();
923
-
924
- const firstRun = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
925
- nativeHookRelay: {
926
- enabled: true,
927
- events: ["pre_tool_use"],
928
- },
929
- });
930
- await firstHarness.waitForMethod("turn/start");
931
- await firstHarness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
932
- await firstRun;
933
-
934
- const firstStartRequest = firstHarness.requests.find(
935
- (request) => request.method === "thread/start",
936
- );
937
- const firstRelayId = extractRelayIdFromThreadRequest(firstStartRequest?.params);
938
- expect(
939
- nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(firstRelayId),
940
- ).toBeUndefined();
941
-
942
- const secondHarness = createResumeHarness();
943
- const secondParams = createParams(sessionFile, workspaceDir);
944
- secondParams.runId = "run-2";
945
- const secondRun = runCodexAppServerAttempt(secondParams, {
946
- nativeHookRelay: {
947
- enabled: true,
948
- events: ["pre_tool_use"],
949
- },
950
- });
951
- await secondHarness.waitForMethod("turn/start");
952
-
953
- const resumeRequest = secondHarness.requests.find(
954
- (request) => request.method === "thread/resume",
955
- );
956
- const secondRelayId = extractRelayIdFromThreadRequest(resumeRequest?.params);
957
- expect(secondRelayId).toBe(firstRelayId);
958
- expect(
959
- nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(firstRelayId),
960
- ).toMatchObject({
961
- runId: "run-2",
962
- allowedEvents: ["pre_tool_use"],
963
- });
964
-
965
- await secondHarness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
966
- await secondRun;
967
- expect(
968
- nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(firstRelayId),
969
- ).toBeUndefined();
970
- });
971
-
972
- it("builds deterministic opaque Codex native hook relay ids", () => {
973
- const relayId = __testing.buildCodexNativeHookRelayId({
974
- agentId: "dev-codex",
975
- sessionId: "cu-pr-relay-smoke",
976
- sessionKey: "agent:dev-codex:cu-pr-relay-smoke",
977
- });
978
-
979
- expect(relayId).toBe("codex-8810b5252975550c887ff0def512b25e944bac39");
980
- expect(relayId).not.toContain("dev-codex");
981
- expect(relayId).not.toContain("cu-pr-relay-smoke");
982
- });
983
-
984
- it("sends clearing Codex native hook config when the relay is disabled", async () => {
985
- const sessionFile = path.join(tempDir, "session.jsonl");
986
- const workspaceDir = path.join(tempDir, "workspace");
987
- const harness = createStartedThreadHarness();
988
-
989
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
990
- nativeHookRelay: { enabled: false },
991
- });
992
- await harness.waitForMethod("turn/start");
993
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
994
- await run;
995
-
996
- const startRequest = harness.requests.find((request) => request.method === "thread/start");
997
- expect(startRequest?.params).toEqual(
998
- expect.objectContaining({
999
- config: {
1000
- "features.codex_hooks": false,
1001
- "hooks.PreToolUse": [],
1002
- "hooks.PostToolUse": [],
1003
- "hooks.PermissionRequest": [],
1004
- "hooks.Stop": [],
1005
- },
1006
- }),
1007
- );
1008
- });
1009
-
1010
- it("cleans up native hook relay state when turn/start fails", async () => {
1011
- const sessionFile = path.join(tempDir, "session.jsonl");
1012
- const workspaceDir = path.join(tempDir, "workspace");
1013
- const harness = createStartedThreadHarness(async (method) => {
1014
- if (method === "turn/start") {
1015
- throw new Error("turn start exploded");
1016
- }
1017
- return undefined;
1018
- });
1019
-
1020
- await expect(
1021
- runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
1022
- nativeHookRelay: { enabled: true },
1023
- }),
1024
- ).rejects.toThrow("turn start exploded");
1025
-
1026
- const startRequest = harness.requests.find((request) => request.method === "thread/start");
1027
- const relayId = extractRelayIdFromThreadRequest(startRequest?.params);
1028
- expect(nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(relayId)).toBeUndefined();
1029
- });
1030
-
1031
- it("cleans up native hook relay state when the Codex turn aborts", async () => {
1032
- const sessionFile = path.join(tempDir, "session.jsonl");
1033
- const workspaceDir = path.join(tempDir, "workspace");
1034
- const harness = createStartedThreadHarness();
1035
-
1036
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
1037
- nativeHookRelay: { enabled: true },
1038
- });
1039
- await harness.waitForMethod("turn/start");
1040
- const startRequest = harness.requests.find((request) => request.method === "thread/start");
1041
- const relayId = extractRelayIdFromThreadRequest(startRequest?.params);
1042
- expect(abortAgentHarnessRun("session-1")).toBe(true);
1043
-
1044
- const result = await run;
1045
-
1046
- expect(result.aborted).toBe(true);
1047
- expect(nativeHookRelayTesting.getNativeHookRelayRegistrationForTests(relayId)).toBeUndefined();
1048
- });
1049
-
1050
- it("fires agent_end with failure metadata when the codex turn fails", async () => {
1051
- const agentEnd = vi.fn();
1052
- const onRunAgentEvent = vi.fn();
1053
- initializeGlobalHookRunner(
1054
- createMockPluginRegistry([{ hookName: "agent_end", handler: agentEnd }]),
1055
- );
1056
- const sessionFile = path.join(tempDir, "session.jsonl");
1057
- const workspaceDir = path.join(tempDir, "workspace");
1058
- const harness = createStartedThreadHarness();
1059
-
1060
- const params = createParams(sessionFile, workspaceDir);
1061
- params.onAgentEvent = onRunAgentEvent;
1062
- const run = runCodexAppServerAttempt(params);
1063
- await harness.waitForMethod("turn/start");
1064
- await harness.notify({
1065
- method: "turn/completed",
1066
- params: {
1067
- threadId: "thread-1",
1068
- turnId: "turn-1",
1069
- turn: {
1070
- id: "turn-1",
1071
- status: "failed",
1072
- error: { message: "codex exploded" },
1073
- },
1074
- },
1075
- });
1076
-
1077
- const result = await run;
1078
-
1079
- expect(result.promptError).toBe("codex exploded");
1080
- await vi.waitFor(() => expect(agentEnd).toHaveBeenCalledTimes(1), { interval: 1 });
1081
- const agentEvents = onRunAgentEvent.mock.calls.map(([event]) => event);
1082
- expect(agentEvents).toEqual(
1083
- expect.arrayContaining([
1084
- {
1085
- stream: "lifecycle",
1086
- data: expect.objectContaining({ phase: "start", startedAt: expect.any(Number) }),
1087
- },
1088
- {
1089
- stream: "lifecycle",
1090
- data: expect.objectContaining({
1091
- phase: "error",
1092
- startedAt: expect.any(Number),
1093
- endedAt: expect.any(Number),
1094
- error: "codex exploded",
1095
- }),
1096
- },
1097
- ]),
1098
- );
1099
- expect(agentEvents.some((event) => event.stream === "assistant")).toBe(false);
1100
- expect(agentEnd).toHaveBeenCalledWith(
1101
- expect.objectContaining({
1102
- success: false,
1103
- error: "codex exploded",
1104
- }),
1105
- expect.objectContaining({
1106
- runId: "run-1",
1107
- sessionId: "session-1",
1108
- }),
1109
- );
1110
- });
1111
-
1112
- it("fires llm_output and agent_end when turn/start fails", async () => {
1113
- const llmInput = vi.fn();
1114
- const llmOutput = vi.fn();
1115
- const agentEnd = vi.fn();
1116
- initializeGlobalHookRunner(
1117
- createMockPluginRegistry([
1118
- { hookName: "llm_input", handler: llmInput },
1119
- { hookName: "llm_output", handler: llmOutput },
1120
- { hookName: "agent_end", handler: agentEnd },
1121
- ]),
1122
- );
1123
- const sessionFile = path.join(tempDir, "session.jsonl");
1124
- const workspaceDir = path.join(tempDir, "workspace");
1125
- SessionManager.open(sessionFile).appendMessage(
1126
- assistantMessage("existing context", Date.now()),
1127
- );
1128
- createStartedThreadHarness(async (method) => {
1129
- if (method === "turn/start") {
1130
- throw new Error("turn start exploded");
1131
- }
1132
- return undefined;
1133
- });
1134
-
1135
- await expect(
1136
- runCodexAppServerAttempt(createParamsWithRuntimePlan(sessionFile, workspaceDir)),
1137
- ).rejects.toThrow("turn start exploded");
1138
-
1139
- await vi.waitFor(() => expect(llmInput).toHaveBeenCalledTimes(1), { interval: 1 });
1140
- await vi.waitFor(() => expect(llmOutput).toHaveBeenCalledTimes(1), { interval: 1 });
1141
- await vi.waitFor(() => expect(agentEnd).toHaveBeenCalledTimes(1), { interval: 1 });
1142
- expect(llmOutput).toHaveBeenCalledWith(
1143
- expect.objectContaining({
1144
- assistantTexts: [],
1145
- model: "gpt-5.4-codex",
1146
- provider: "codex",
1147
- resolvedRef: "codex/gpt-5.4-codex",
1148
- harnessId: "codex",
1149
- runId: "run-1",
1150
- sessionId: "session-1",
1151
- }),
1152
- expect.any(Object),
1153
- );
1154
- expect(agentEnd).toHaveBeenCalledWith(
1155
- expect.objectContaining({
1156
- success: false,
1157
- error: "turn start exploded",
1158
- messages: expect.arrayContaining([
1159
- expect.objectContaining({ role: "assistant" }),
1160
- expect.objectContaining({ role: "user" }),
1161
- ]),
1162
- }),
1163
- expect.any(Object),
1164
- );
1165
- });
1166
-
1167
- it("fires agent_end with success false when the codex turn is aborted", async () => {
1168
- const agentEnd = vi.fn();
1169
- initializeGlobalHookRunner(
1170
- createMockPluginRegistry([{ hookName: "agent_end", handler: agentEnd }]),
1171
- );
1172
- const { waitForMethod } = createStartedThreadHarness();
1173
- const run = runCodexAppServerAttempt(
1174
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1175
- );
1176
-
1177
- await waitForMethod("turn/start");
1178
- expect(abortAgentHarnessRun("session-1")).toBe(true);
1179
-
1180
- const result = await run;
1181
- expect(result.aborted).toBe(true);
1182
- await vi.waitFor(() => expect(agentEnd).toHaveBeenCalledTimes(1), { interval: 1 });
1183
- expect(agentEnd).toHaveBeenCalledWith(
1184
- expect.objectContaining({
1185
- success: false,
1186
- }),
1187
- expect.any(Object),
1188
- );
1189
- });
1190
-
1191
- it("forwards queued user input and aborts the active app-server turn", async () => {
1192
- const { requests, waitForMethod } = createStartedThreadHarness();
1193
-
1194
- const run = runCodexAppServerAttempt(
1195
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1196
- );
1197
- await waitForMethod("turn/start");
1198
-
1199
- expect(queueAgentHarnessMessage("session-1", "more context")).toBe(true);
1200
- await vi.waitFor(
1201
- () => expect(requests.some((entry) => entry.method === "turn/steer")).toBe(true),
1202
- { interval: 1 },
1203
- );
1204
- expect(abortAgentHarnessRun("session-1")).toBe(true);
1205
- await vi.waitFor(
1206
- () => expect(requests.some((entry) => entry.method === "turn/interrupt")).toBe(true),
1207
- { interval: 1 },
1208
- );
1209
-
1210
- const result = await run;
1211
- expect(result.aborted).toBe(true);
1212
- expect(requests).toEqual(
1213
- expect.arrayContaining([
1214
- {
1215
- method: "thread/start",
1216
- params: expect.objectContaining({
1217
- model: "gpt-5.4-codex",
1218
- approvalPolicy: "never",
1219
- sandbox: "danger-full-access",
1220
- approvalsReviewer: "user",
1221
- developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
1222
- }),
1223
- },
1224
- {
1225
- method: "turn/steer",
1226
- params: {
1227
- threadId: "thread-1",
1228
- expectedTurnId: "turn-1",
1229
- input: [{ type: "text", text: "more context", text_elements: [] }],
1230
- },
1231
- },
1232
- {
1233
- method: "turn/interrupt",
1234
- params: { threadId: "thread-1", turnId: "turn-1" },
1235
- },
1236
- ]),
1237
- );
1238
- });
1239
-
1240
- it("batches default queued steering before sending turn/steer", async () => {
1241
- const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
1242
-
1243
- const run = runCodexAppServerAttempt(
1244
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1245
- );
1246
- await waitForMethod("turn/start");
1247
-
1248
- expect(queueAgentHarnessMessage("session-1", "first", { debounceMs: 5 })).toBe(true);
1249
- expect(queueAgentHarnessMessage("session-1", "second", { debounceMs: 5 })).toBe(true);
1250
-
1251
- await vi.waitFor(
1252
- () =>
1253
- expect(requests.filter((entry) => entry.method === "turn/steer")).toEqual([
1254
- {
1255
- method: "turn/steer",
1256
- params: {
1257
- threadId: "thread-1",
1258
- expectedTurnId: "turn-1",
1259
- input: [
1260
- { type: "text", text: "first", text_elements: [] },
1261
- { type: "text", text: "second", text_elements: [] },
1262
- ],
1263
- },
1264
- },
1265
- ]),
1266
- { interval: 1 },
1267
- );
1268
-
1269
- await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1270
- await run;
1271
- });
1272
-
1273
- it("flushes pending default queued steering during normal turn cleanup", async () => {
1274
- const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
1275
-
1276
- const run = runCodexAppServerAttempt(
1277
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1278
- );
1279
- await waitForMethod("turn/start");
1280
-
1281
- expect(queueAgentHarnessMessage("session-1", "late steer", { debounceMs: 30_000 })).toBe(true);
1282
-
1283
- await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1284
- await run;
1285
-
1286
- expect(requests.filter((entry) => entry.method === "turn/steer")).toEqual([
1287
- {
1288
- method: "turn/steer",
1289
- params: {
1290
- threadId: "thread-1",
1291
- expectedTurnId: "turn-1",
1292
- input: [{ type: "text", text: "late steer", text_elements: [] }],
1293
- },
1294
- },
1295
- ]);
1296
- });
1297
-
1298
- it("keeps legacy queue steering as separate turn/steer requests", async () => {
1299
- const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
1300
-
1301
- const run = runCodexAppServerAttempt(
1302
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1303
- );
1304
- await waitForMethod("turn/start");
1305
-
1306
- expect(queueAgentHarnessMessage("session-1", "first", { steeringMode: "one-at-a-time" })).toBe(
1307
- true,
1308
- );
1309
- expect(queueAgentHarnessMessage("session-1", "second", { steeringMode: "one-at-a-time" })).toBe(
1310
- true,
1311
- );
1312
-
1313
- await vi.waitFor(
1314
- () =>
1315
- expect(requests.filter((entry) => entry.method === "turn/steer")).toEqual([
1316
- {
1317
- method: "turn/steer",
1318
- params: {
1319
- threadId: "thread-1",
1320
- expectedTurnId: "turn-1",
1321
- input: [{ type: "text", text: "first", text_elements: [] }],
1322
- },
1323
- },
1324
- {
1325
- method: "turn/steer",
1326
- params: {
1327
- threadId: "thread-1",
1328
- expectedTurnId: "turn-1",
1329
- input: [{ type: "text", text: "second", text_elements: [] }],
1330
- },
1331
- },
1332
- ]),
1333
- { interval: 1 },
1334
- );
1335
-
1336
- await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1337
- await run;
1338
- });
1339
-
1340
- it("routes MCP approval elicitations through the native bridge", async () => {
1341
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
1342
- let handleRequest:
1343
- | ((request: { id: string; method: string; params?: unknown }) => Promise<unknown>)
1344
- | undefined;
1345
- const bridgeSpy = vi
1346
- .spyOn(elicitationBridge, "handleCodexAppServerElicitationRequest")
1347
- .mockResolvedValue({
1348
- action: "accept",
1349
- content: null,
1350
- _meta: null,
1351
- });
1352
- const request = vi.fn(async (method: string) => {
1353
- if (method === "thread/start") {
1354
- return threadStartResult();
1355
- }
1356
- if (method === "turn/start") {
1357
- return turnStartResult();
1358
- }
1359
- return {};
1360
- });
1361
- __testing.setCodexAppServerClientFactoryForTests(
1362
- async () =>
1363
- ({
1364
- request,
1365
- addNotificationHandler: (handler: typeof notify) => {
1366
- notify = handler;
1367
- return () => undefined;
1368
- },
1369
- addRequestHandler: (
1370
- handler: (request: {
1371
- id: string;
1372
- method: string;
1373
- params?: unknown;
1374
- }) => Promise<unknown>,
1375
- ) => {
1376
- handleRequest = handler;
1377
- return () => undefined;
1378
- },
1379
- }) as never,
1380
- );
1381
-
1382
- const run = runCodexAppServerAttempt(
1383
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1384
- );
1385
- await vi.waitFor(() => expect(handleRequest).toBeTypeOf("function"), { interval: 1 });
1386
-
1387
- const result = await handleRequest?.({
1388
- id: "request-elicitation-1",
1389
- method: "mcpServer/elicitation/request",
1390
- params: {
1391
- threadId: "thread-1",
1392
- turnId: "turn-1",
1393
- serverName: "codex_apps__github",
1394
- mode: "form",
1395
- },
1396
- });
1397
-
1398
- expect(result).toEqual({
1399
- action: "accept",
1400
- content: null,
1401
- _meta: null,
1402
- });
1403
- expect(bridgeSpy).toHaveBeenCalledWith(
1404
- expect.objectContaining({
1405
- threadId: "thread-1",
1406
- turnId: "turn-1",
1407
- }),
1408
- );
1409
-
1410
- await notify({
1411
- method: "turn/completed",
1412
- params: {
1413
- threadId: "thread-1",
1414
- turnId: "turn-1",
1415
- turn: { id: "turn-1", status: "completed" },
1416
- },
1417
- });
1418
- await run;
1419
- });
1420
-
1421
- it("routes request_user_input prompts through the active run follow-up queue", async () => {
1422
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
1423
- let handleRequest:
1424
- | ((request: { id: string; method: string; params?: unknown }) => Promise<unknown>)
1425
- | undefined;
1426
- const request = vi.fn(async (method: string) => {
1427
- if (method === "thread/start") {
1428
- return threadStartResult();
1429
- }
1430
- if (method === "turn/start") {
1431
- return turnStartResult();
1432
- }
1433
- return {};
1434
- });
1435
- __testing.setCodexAppServerClientFactoryForTests(
1436
- async () =>
1437
- ({
1438
- request,
1439
- addNotificationHandler: (handler: typeof notify) => {
1440
- notify = handler;
1441
- return () => undefined;
1442
- },
1443
- addRequestHandler: (
1444
- handler: (request: {
1445
- id: string;
1446
- method: string;
1447
- params?: unknown;
1448
- }) => Promise<unknown>,
1449
- ) => {
1450
- handleRequest = handler;
1451
- return () => undefined;
1452
- },
1453
- }) as never,
1454
- );
1455
-
1456
- const params = createParams(
1457
- path.join(tempDir, "session.jsonl"),
1458
- path.join(tempDir, "workspace"),
1459
- );
1460
- params.onBlockReply = vi.fn();
1461
- const run = runCodexAppServerAttempt(params);
1462
- await vi.waitFor(
1463
- () => expect(request.mock.calls.some(([method]) => method === "turn/start")).toBe(true),
1464
- { interval: 1 },
1465
- );
1466
- await vi.waitFor(() => expect(handleRequest).toBeTypeOf("function"), { interval: 1 });
1467
-
1468
- const response = handleRequest?.({
1469
- id: "request-input-1",
1470
- method: "item/tool/requestUserInput",
1471
- params: {
1472
- threadId: "thread-1",
1473
- turnId: "turn-1",
1474
- itemId: "ask-1",
1475
- questions: [
1476
- {
1477
- id: "mode",
1478
- header: "Mode",
1479
- question: "Pick a mode",
1480
- isOther: false,
1481
- isSecret: false,
1482
- options: [
1483
- { label: "Fast", description: "Use less reasoning" },
1484
- { label: "Deep", description: "Use more reasoning" },
1485
- ],
1486
- },
1487
- ],
1488
- },
1489
- });
1490
-
1491
- await vi.waitFor(() => expect(params.onBlockReply).toHaveBeenCalledTimes(1), { interval: 1 });
1492
- expect(queueAgentHarnessMessage("session-1", "2")).toBe(true);
1493
- await expect(response).resolves.toEqual({
1494
- answers: { mode: { answers: ["Deep"] } },
1495
- });
1496
- expect(request).not.toHaveBeenCalledWith(
1497
- "turn/steer",
1498
- expect.objectContaining({ expectedTurnId: "turn-1" }),
1499
- );
1500
-
1501
- await notify({
1502
- method: "turn/completed",
1503
- params: {
1504
- threadId: "thread-1",
1505
- turnId: "turn-1",
1506
- turn: { id: "turn-1", status: "completed" },
1507
- },
1508
- });
1509
- await run;
1510
- });
1511
-
1512
- it("does not leak unhandled rejections when shutdown closes before interrupt", async () => {
1513
- const unhandledRejections: unknown[] = [];
1514
- const onUnhandledRejection = (reason: unknown) => {
1515
- unhandledRejections.push(reason);
1516
- };
1517
- process.on("unhandledRejection", onUnhandledRejection);
1518
- try {
1519
- const { waitForMethod } = createStartedThreadHarness(async (method) => {
1520
- if (method === "turn/interrupt") {
1521
- throw new Error("codex app-server client is closed");
1522
- }
1523
- });
1524
- const abortController = new AbortController();
1525
- const params = createParams(
1526
- path.join(tempDir, "session.jsonl"),
1527
- path.join(tempDir, "workspace"),
1528
- );
1529
- params.abortSignal = abortController.signal;
1530
-
1531
- const run = runCodexAppServerAttempt(params);
1532
- await waitForMethod("turn/start");
1533
- abortController.abort("shutdown");
1534
-
1535
- await expect(run).resolves.toMatchObject({ aborted: true });
1536
- await new Promise((resolve) => setImmediate(resolve));
1537
- expect(unhandledRejections).toEqual([]);
1538
- } finally {
1539
- process.off("unhandledRejection", onUnhandledRejection);
1540
- }
1541
- });
1542
-
1543
- it("forwards image attachments to the app-server turn input", async () => {
1544
- const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
1545
- const params = createParams(
1546
- path.join(tempDir, "session.jsonl"),
1547
- path.join(tempDir, "workspace"),
1548
- );
1549
- params.model = createCodexTestModel("codex", ["text", "image"]);
1550
- params.images = [
1551
- {
1552
- type: "image",
1553
- mimeType: "image/png",
1554
- data: "aW1hZ2UtYnl0ZXM=",
1555
- },
1556
- ];
1557
-
1558
- const run = runCodexAppServerAttempt(params);
1559
- await waitForMethod("turn/start");
1560
- await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1561
- await run;
1562
-
1563
- expect(requests).toEqual(
1564
- expect.arrayContaining([
1565
- {
1566
- method: "turn/start",
1567
- params: expect.objectContaining({
1568
- input: [
1569
- { type: "text", text: "hello", text_elements: [] },
1570
- { type: "image", url: "data:image/png;base64,aW1hZ2UtYnl0ZXM=" },
1571
- ],
1572
- }),
1573
- },
1574
- ]),
1575
- );
1576
- });
1577
-
1578
- it("does not drop turn completion notifications emitted while turn/start is in flight", async () => {
1579
- let harness: ReturnType<typeof createAppServerHarness>;
1580
- harness = createAppServerHarness(async (method) => {
1581
- if (method === "thread/start") {
1582
- return threadStartResult();
1583
- }
1584
- if (method === "turn/start") {
1585
- await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1586
- return turnStartResult("turn-1", "completed");
1587
- }
1588
- return {};
1589
- });
1590
-
1591
- await expect(
1592
- runCodexAppServerAttempt(
1593
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1594
- ),
1595
- ).resolves.toMatchObject({
1596
- aborted: false,
1597
- timedOut: false,
1598
- });
1599
- });
1600
-
1601
- it("completes when turn/start returns a terminal turn without a follow-up notification", async () => {
1602
- const harness = createAppServerHarness(async (method) => {
1603
- if (method === "thread/start") {
1604
- return threadStartResult();
1605
- }
1606
- if (method === "turn/start") {
1607
- return {
1608
- turn: {
1609
- id: "turn-1",
1610
- status: "completed",
1611
- items: [{ type: "agentMessage", id: "msg-1", text: "done from response" }],
1612
- },
1613
- };
1614
- }
1615
- return {};
1616
- });
1617
-
1618
- const result = await runCodexAppServerAttempt(
1619
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1620
- );
1621
-
1622
- expect(harness.requests.map((entry) => entry.method)).toContain("turn/start");
1623
- expect(result).toMatchObject({
1624
- assistantTexts: ["done from response"],
1625
- aborted: false,
1626
- timedOut: false,
1627
- });
1628
- });
1629
-
1630
- it("does not complete on unscoped turn/completed notifications", async () => {
1631
- const harness = createStartedThreadHarness();
1632
- const run = runCodexAppServerAttempt(
1633
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1634
- );
1635
- let resolved = false;
1636
- void run.then(() => {
1637
- resolved = true;
1638
- });
1639
-
1640
- await harness.waitForMethod("turn/start");
1641
- await harness.notify({
1642
- method: "turn/completed",
1643
- params: {
1644
- turn: {
1645
- id: "turn-1",
1646
- status: "completed",
1647
- items: [{ type: "agentMessage", id: "msg-wrong", text: "wrong completion" }],
1648
- },
1649
- },
1650
- });
1651
- await new Promise((resolve) => setTimeout(resolve, 25));
1652
- expect(resolved).toBe(false);
1653
-
1654
- await harness.notify({
1655
- method: "turn/completed",
1656
- params: {
1657
- threadId: "thread-1",
1658
- turn: {
1659
- id: "turn-1",
1660
- status: "completed",
1661
- items: [{ type: "agentMessage", id: "msg-right", text: "final completion" }],
1662
- },
1663
- },
1664
- });
1665
-
1666
- await expect(run).resolves.toMatchObject({
1667
- assistantTexts: ["final completion"],
1668
- aborted: false,
1669
- timedOut: false,
1670
- });
1671
- });
1672
-
1673
- it("releases completion when a projector callback throws during turn/completed", async () => {
1674
- // Regression for openclaw/openclaw#67996: a throw inside the projector's
1675
- // turn/completed handler must not strand resolveCompletion, otherwise the
1676
- // gateway session lane stays locked and every follow-up message queues
1677
- // behind a run that will never resolve.
1678
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
1679
- const request = vi.fn(async (method: string) => {
1680
- if (method === "thread/start") {
1681
- return threadStartResult("thread-1");
1682
- }
1683
- if (method === "turn/start") {
1684
- return turnStartResult("turn-1", "inProgress");
1685
- }
1686
- return {};
1687
- });
1688
- __testing.setCodexAppServerClientFactoryForTests(
1689
- async () =>
1690
- ({
1691
- request,
1692
- addNotificationHandler: (handler: typeof notify) => {
1693
- notify = handler;
1694
- return () => undefined;
1695
- },
1696
- addRequestHandler: () => () => undefined,
1697
- }) as never,
1698
- );
1699
- const params = createParams(
1700
- path.join(tempDir, "session.jsonl"),
1701
- path.join(tempDir, "workspace"),
1702
- );
1703
- params.onAgentEvent = () => {
1704
- throw new Error("downstream consumer exploded");
1705
- };
1706
- const run = runCodexAppServerAttempt(params);
1707
- await vi.waitFor(() =>
1708
- expect(request.mock.calls.some(([method]) => method === "turn/start")).toBe(true),
1709
- );
1710
- await notify({
1711
- method: "turn/completed",
1712
- params: {
1713
- threadId: "thread-1",
1714
- turn: {
1715
- id: "turn-1",
1716
- status: "completed",
1717
- items: [{ id: "plan-1", type: "plan", text: "step one\nstep two" }],
1718
- },
1719
- },
1720
- });
1721
- await expect(run).resolves.toMatchObject({
1722
- aborted: false,
1723
- timedOut: false,
1724
- });
1725
- });
1726
-
1727
- it("routes MCP approval elicitations through the native bridge", async () => {
1728
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
1729
- let handleRequest:
1730
- | ((request: { id: string; method: string; params?: unknown }) => Promise<unknown>)
1731
- | undefined;
1732
- const bridgeSpy = vi
1733
- .spyOn(elicitationBridge, "handleCodexAppServerElicitationRequest")
1734
- .mockResolvedValue({
1735
- action: "accept",
1736
- content: { approve: true },
1737
- _meta: null,
1738
- });
1739
- const request = vi.fn(async (method: string) => {
1740
- if (method === "thread/start") {
1741
- return threadStartResult("thread-1");
1742
- }
1743
- if (method === "turn/start") {
1744
- return turnStartResult("turn-1", "inProgress");
1745
- }
1746
- return {};
1747
- });
1748
- __testing.setCodexAppServerClientFactoryForTests(
1749
- async () =>
1750
- ({
1751
- request,
1752
- addNotificationHandler: (handler: typeof notify) => {
1753
- notify = handler;
1754
- return () => undefined;
1755
- },
1756
- addRequestHandler: (
1757
- handler: (request: {
1758
- id: string;
1759
- method: string;
1760
- params?: unknown;
1761
- }) => Promise<unknown>,
1762
- ) => {
1763
- handleRequest = handler;
1764
- return () => undefined;
1765
- },
1766
- }) as never,
1767
- );
1768
-
1769
- const run = runCodexAppServerAttempt(
1770
- createParams(path.join(tempDir, "session.jsonl"), path.join(tempDir, "workspace")),
1771
- );
1772
- await vi.waitFor(() => expect(handleRequest).toBeTypeOf("function"));
1773
-
1774
- const result = await handleRequest?.({
1775
- id: "request-elicitation-1",
1776
- method: "mcpServer/elicitation/request",
1777
- params: {
1778
- threadId: "thread-1",
1779
- turnId: "turn-1",
1780
- serverName: "codex_apps__github",
1781
- mode: "form",
1782
- },
1783
- });
1784
-
1785
- expect(result).toEqual({
1786
- action: "accept",
1787
- content: { approve: true },
1788
- _meta: null,
1789
- });
1790
- expect(bridgeSpy).toHaveBeenCalledWith(
1791
- expect.objectContaining({
1792
- threadId: "thread-1",
1793
- turnId: "turn-1",
1794
- }),
1795
- );
1796
-
1797
- await notify({
1798
- method: "turn/completed",
1799
- params: {
1800
- threadId: "thread-1",
1801
- turnId: "turn-1",
1802
- turn: { id: "turn-1", status: "completed" },
1803
- },
1804
- });
1805
- await run;
1806
- });
1807
-
1808
- it("times out app-server startup before thread setup can hang forever", async () => {
1809
- __testing.setCodexAppServerClientFactoryForTests(() => new Promise<never>(() => undefined));
1810
- const params = createParams(
1811
- path.join(tempDir, "session.jsonl"),
1812
- path.join(tempDir, "workspace"),
1813
- );
1814
- params.timeoutMs = 1;
1815
-
1816
- await expect(runCodexAppServerAttempt(params, { startupTimeoutFloorMs: 1 })).rejects.toThrow(
1817
- "codex app-server startup timed out",
1818
- );
1819
- expect(queueAgentHarnessMessage("session-1", "after timeout")).toBe(false);
1820
- });
1821
-
1822
- it("passes the selected auth profile into app-server startup", async () => {
1823
- const seenAuthProfileIds: Array<string | undefined> = [];
1824
- const seenAgentDirs: Array<string | undefined> = [];
1825
- const { requests, waitForMethod, completeTurn } = createStartedThreadHarness(undefined, {
1826
- onStart: (authProfileId, agentDir) => {
1827
- seenAuthProfileIds.push(authProfileId);
1828
- seenAgentDirs.push(agentDir);
1829
- },
1830
- });
1831
- const params = createParams(
1832
- path.join(tempDir, "session.jsonl"),
1833
- path.join(tempDir, "workspace"),
1834
- );
1835
- params.authProfileId = "openai-codex:work";
1836
- params.agentDir = path.join(tempDir, "agent");
1837
-
1838
- const run = runCodexAppServerAttempt(params);
1839
- await vi.waitFor(() => expect(seenAuthProfileIds).toEqual(["openai-codex:work"]), {
1840
- interval: 1,
1841
- });
1842
- await waitForMethod("turn/start");
1843
- await new Promise<void>((resolve) => setImmediate(resolve));
1844
- await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
1845
- await run;
1846
-
1847
- expect(seenAuthProfileIds).toEqual(["openai-codex:work"]);
1848
- expect(seenAgentDirs).toEqual([path.join(tempDir, "agent")]);
1849
- expect(requests.map((entry) => entry.method)).toContain("turn/start");
1850
- });
1851
-
1852
- it("times out turn start before the active run handle is installed", async () => {
1853
- const request = vi.fn(
1854
- async (method: string, _params?: unknown, options?: { timeoutMs?: number }) => {
1855
- if (method === "thread/start") {
1856
- return threadStartResult("thread-1");
1857
- }
1858
- if (method === "turn/start") {
1859
- return await new Promise<never>((_, reject) => {
1860
- setTimeout(() => reject(new Error("turn/start timed out")), options?.timeoutMs ?? 0);
1861
- });
1862
- }
1863
- return {};
1864
- },
1865
- );
1866
- __testing.setCodexAppServerClientFactoryForTests(
1867
- async () =>
1868
- ({
1869
- request,
1870
- addNotificationHandler: () => () => undefined,
1871
- addRequestHandler: () => () => undefined,
1872
- }) as never,
1873
- );
1874
- const params = createParams(
1875
- path.join(tempDir, "session.jsonl"),
1876
- path.join(tempDir, "workspace"),
1877
- );
1878
- params.timeoutMs = 1;
1879
-
1880
- await expect(runCodexAppServerAttempt(params)).rejects.toThrow("turn/start timed out");
1881
- expect(queueAgentHarnessMessage("session-1", "after timeout")).toBe(false);
1882
- });
1883
-
1884
- it("keeps extended history enabled when resuming a bound Codex thread", async () => {
1885
- const sessionFile = path.join(tempDir, "session.jsonl");
1886
- const workspaceDir = path.join(tempDir, "workspace");
1887
- await writeExistingBinding(sessionFile, workspaceDir, { dynamicToolsFingerprint: "[]" });
1888
- const { requests, waitForMethod, completeTurn } = createResumeHarness();
1889
-
1890
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
1891
- await waitForMethod("turn/start");
1892
- await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
1893
- await run;
1894
-
1895
- expectResumeRequest(requests, {
1896
- threadId: "thread-existing",
1897
- model: "gpt-5.4-codex",
1898
- approvalPolicy: "never",
1899
- approvalsReviewer: "user",
1900
- sandbox: "danger-full-access",
1901
- developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
1902
- persistExtendedHistory: true,
1903
- });
1904
- });
1905
-
1906
- it("resumes a bound Codex thread when only dynamic tool descriptions change", async () => {
1907
- const sessionFile = path.join(tempDir, "session.jsonl");
1908
- const workspaceDir = path.join(tempDir, "workspace");
1909
- const params = createParams(sessionFile, workspaceDir);
1910
- const appServer = createThreadLifecycleAppServerOptions();
1911
- const request = vi.fn(async (method: string) => {
1912
- if (method === "thread/start") {
1913
- return threadStartResult("thread-existing");
1914
- }
1915
- if (method === "thread/resume") {
1916
- return threadStartResult("thread-existing");
1917
- }
1918
- throw new Error(`unexpected method: ${method}`);
1919
- });
1920
-
1921
- await startOrResumeThread({
1922
- client: { request } as never,
1923
- params,
1924
- cwd: workspaceDir,
1925
- dynamicTools: [
1926
- createMessageDynamicTool("Send and manage messages for the current Slack thread."),
1927
- ],
1928
- appServer,
1929
- });
1930
- const binding = await startOrResumeThread({
1931
- client: { request } as never,
1932
- params,
1933
- cwd: workspaceDir,
1934
- dynamicTools: [
1935
- createMessageDynamicTool("Send and manage messages for the current Discord channel."),
1936
- ],
1937
- appServer,
1938
- });
1939
-
1940
- expect(binding.threadId).toBe("thread-existing");
1941
- expect(request.mock.calls.map(([method]) => method)).toEqual(["thread/start", "thread/resume"]);
1942
- });
1943
-
1944
- it("preserves the binding when the app-server closes during thread resume", async () => {
1945
- const sessionFile = path.join(tempDir, "session.jsonl");
1946
- const workspaceDir = path.join(tempDir, "workspace");
1947
- await writeExistingBinding(sessionFile, workspaceDir, { dynamicToolsFingerprint: "[]" });
1948
- const appServer = createThreadLifecycleAppServerOptions();
1949
- const request = vi.fn(async (method: string) => {
1950
- if (method === "thread/resume") {
1951
- throw new Error("codex app-server client is closed");
1952
- }
1953
- throw new Error(`unexpected method: ${method}`);
1954
- });
1955
-
1956
- await expect(
1957
- startOrResumeThread({
1958
- client: { request } as never,
1959
- params: createParams(sessionFile, workspaceDir),
1960
- cwd: workspaceDir,
1961
- dynamicTools: [],
1962
- appServer,
1963
- }),
1964
- ).rejects.toThrow("codex app-server client is closed");
1965
-
1966
- expect(request.mock.calls.map(([method]) => method)).toEqual(["thread/resume"]);
1967
- await expect(readCodexAppServerBinding(sessionFile)).resolves.toMatchObject({
1968
- threadId: "thread-existing",
1969
- });
1970
- });
1971
-
1972
- it("restarts the app-server once when a shared client closes during startup", async () => {
1973
- const sessionFile = path.join(tempDir, "session.jsonl");
1974
- const workspaceDir = path.join(tempDir, "workspace");
1975
- await writeExistingBinding(sessionFile, workspaceDir, { dynamicToolsFingerprint: "[]" });
1976
- const requests: string[][] = [];
1977
- let starts = 0;
1978
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
1979
- __testing.setCodexAppServerClientFactoryForTests(async () => {
1980
- const startIndex = starts++;
1981
- const methods: string[] = [];
1982
- requests.push(methods);
1983
- return {
1984
- request: vi.fn(async (method: string) => {
1985
- methods.push(method);
1986
- if (method === "thread/resume" && startIndex === 0) {
1987
- throw new Error("codex app-server client is closed");
1988
- }
1989
- if (method === "thread/resume") {
1990
- return threadStartResult("thread-existing");
1991
- }
1992
- if (method === "turn/start") {
1993
- return turnStartResult();
1994
- }
1995
- return {};
1996
- }),
1997
- addNotificationHandler: (handler: typeof notify) => {
1998
- notify = handler;
1999
- return () => undefined;
2000
- },
2001
- addRequestHandler: () => () => undefined,
2002
- } as never;
2003
- });
2004
-
2005
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
2006
- await vi.waitFor(() => expect(requests[1]).toContain("turn/start"), { interval: 1 });
2007
- await notify({
2008
- method: "turn/completed",
2009
- params: {
2010
- threadId: "thread-existing",
2011
- turnId: "turn-1",
2012
- turn: { id: "turn-1", status: "completed" },
2013
- },
2014
- });
2015
-
2016
- await expect(run).resolves.toMatchObject({ aborted: false });
2017
- expect(requests).toEqual([["thread/resume"], ["thread/resume", "turn/start"]]);
2018
- });
2019
-
2020
- it("tolerates a second app-server close while retrying startup", async () => {
2021
- const sessionFile = path.join(tempDir, "session.jsonl");
2022
- const workspaceDir = path.join(tempDir, "workspace");
2023
- await writeExistingBinding(sessionFile, workspaceDir, { dynamicToolsFingerprint: "[]" });
2024
- const requests: string[][] = [];
2025
- let starts = 0;
2026
- let notify: (notification: CodexServerNotification) => Promise<void> = async () => undefined;
2027
- __testing.setCodexAppServerClientFactoryForTests(async () => {
2028
- const startIndex = starts++;
2029
- const methods: string[] = [];
2030
- requests.push(methods);
2031
- return {
2032
- request: vi.fn(async (method: string) => {
2033
- methods.push(method);
2034
- if (method === "thread/resume" && startIndex < 2) {
2035
- throw new Error("codex app-server client is closed");
2036
- }
2037
- if (method === "thread/resume") {
2038
- return threadStartResult("thread-existing");
2039
- }
2040
- if (method === "turn/start") {
2041
- return turnStartResult();
2042
- }
2043
- return {};
2044
- }),
2045
- addNotificationHandler: (handler: typeof notify) => {
2046
- notify = handler;
2047
- return () => undefined;
2048
- },
2049
- addRequestHandler: () => () => undefined,
2050
- } as never;
2051
- });
2052
-
2053
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
2054
- await vi.waitFor(() => expect(requests[2]).toContain("turn/start"), { interval: 1 });
2055
- await notify({
2056
- method: "turn/completed",
2057
- params: {
2058
- threadId: "thread-existing",
2059
- turnId: "turn-1",
2060
- turn: { id: "turn-1", status: "completed" },
2061
- },
2062
- });
2063
-
2064
- await expect(run).resolves.toMatchObject({ aborted: false });
2065
- expect(requests).toEqual([
2066
- ["thread/resume"],
2067
- ["thread/resume"],
2068
- ["thread/resume", "turn/start"],
2069
- ]);
2070
- });
2071
-
2072
- it("passes native hook relay config on thread start and resume", async () => {
2073
- const sessionFile = path.join(tempDir, "session.jsonl");
2074
- const workspaceDir = path.join(tempDir, "workspace");
2075
- const params = createParams(sessionFile, workspaceDir);
2076
- const appServer = createThreadLifecycleAppServerOptions();
2077
- const request = vi.fn(async (method: string) => {
2078
- if (method === "thread/start") {
2079
- return threadStartResult("thread-existing");
2080
- }
2081
- if (method === "thread/resume") {
2082
- return threadStartResult("thread-existing");
2083
- }
2084
- throw new Error(`unexpected method: ${method}`);
2085
- });
2086
- const config = {
2087
- "features.codex_hooks": true,
2088
- "hooks.PreToolUse": [],
2089
- };
2090
-
2091
- await startOrResumeThread({
2092
- client: { request } as never,
2093
- params,
2094
- cwd: workspaceDir,
2095
- dynamicTools: [],
2096
- appServer,
2097
- config,
2098
- });
2099
- await startOrResumeThread({
2100
- client: { request } as never,
2101
- params,
2102
- cwd: workspaceDir,
2103
- dynamicTools: [],
2104
- appServer,
2105
- config,
2106
- });
2107
-
2108
- expect(request.mock.calls).toEqual([
2109
- [
2110
- "thread/start",
2111
- expect.objectContaining({
2112
- config,
2113
- }),
2114
- ],
2115
- [
2116
- "thread/resume",
2117
- expect.objectContaining({
2118
- config,
2119
- }),
2120
- ],
2121
- ]);
2122
- });
2123
-
2124
- it("starts a new Codex thread when dynamic tool schemas change", async () => {
2125
- const sessionFile = path.join(tempDir, "session.jsonl");
2126
- const workspaceDir = path.join(tempDir, "workspace");
2127
- const params = createParams(sessionFile, workspaceDir);
2128
- const appServer = createThreadLifecycleAppServerOptions();
2129
- let nextThread = 1;
2130
- const request = vi.fn(async (method: string) => {
2131
- if (method === "thread/start") {
2132
- return threadStartResult(`thread-${nextThread++}`);
2133
- }
2134
- throw new Error(`unexpected method: ${method}`);
2135
- });
2136
-
2137
- await startOrResumeThread({
2138
- client: { request } as never,
2139
- params,
2140
- cwd: workspaceDir,
2141
- dynamicTools: [createMessageDynamicTool("Send and manage messages.", ["send"])],
2142
- appServer,
2143
- });
2144
- const binding = await startOrResumeThread({
2145
- client: { request } as never,
2146
- params,
2147
- cwd: workspaceDir,
2148
- dynamicTools: [createMessageDynamicTool("Send and manage messages.", ["send", "read"])],
2149
- appServer,
2150
- });
2151
-
2152
- expect(binding.threadId).toBe("thread-2");
2153
- expect(request.mock.calls.map(([method]) => method)).toEqual(["thread/start", "thread/start"]);
2154
- });
2155
-
2156
- it("passes configured app-server policy, sandbox, service tier, and model on resume", async () => {
2157
- const sessionFile = path.join(tempDir, "session.jsonl");
2158
- const workspaceDir = path.join(tempDir, "workspace");
2159
- await writeExistingBinding(sessionFile, workspaceDir, { model: "gpt-5.2" });
2160
- const { requests, waitForMethod, completeTurn } = createResumeHarness();
2161
-
2162
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
2163
- pluginConfig: {
2164
- appServer: {
2165
- approvalPolicy: "on-request",
2166
- approvalsReviewer: "guardian_subagent",
2167
- sandbox: "danger-full-access",
2168
- serviceTier: "fast",
2169
- },
2170
- },
2171
- });
2172
- await waitForMethod("turn/start");
2173
- await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
2174
- await run;
2175
-
2176
- expectResumeRequest(requests, {
2177
- threadId: "thread-existing",
2178
- model: "gpt-5.4-codex",
2179
- approvalPolicy: "on-request",
2180
- approvalsReviewer: "guardian_subagent",
2181
- sandbox: "danger-full-access",
2182
- serviceTier: "fast",
2183
- developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
2184
- persistExtendedHistory: true,
2185
- });
2186
- expect(requests).toEqual(
2187
- expect.arrayContaining([
2188
- {
2189
- method: "turn/start",
2190
- params: expect.objectContaining({
2191
- approvalPolicy: "on-request",
2192
- approvalsReviewer: "guardian_subagent",
2193
- sandboxPolicy: { type: "dangerFullAccess" },
2194
- serviceTier: "fast",
2195
- model: "gpt-5.4-codex",
2196
- }),
2197
- },
2198
- ]),
2199
- );
2200
- });
2201
-
2202
- it("drops invalid legacy service tiers before app-server resume and turn requests", async () => {
2203
- const sessionFile = path.join(tempDir, "session.jsonl");
2204
- const workspaceDir = path.join(tempDir, "workspace");
2205
- await writeExistingBinding(sessionFile, workspaceDir, { model: "gpt-5.2" });
2206
- const { requests, waitForMethod, completeTurn } = createResumeHarness();
2207
-
2208
- const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir), {
2209
- pluginConfig: {
2210
- appServer: {
2211
- approvalPolicy: "on-request",
2212
- sandbox: "danger-full-access",
2213
- serviceTier: "priority",
2214
- },
2215
- },
2216
- });
2217
- await waitForMethod("turn/start");
2218
- await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
2219
- await run;
2220
-
2221
- const resumeRequest = requests.find((request) => request.method === "thread/resume");
2222
- expect(resumeRequest?.params).toEqual(
2223
- expect.not.objectContaining({ serviceTier: expect.anything() }),
2224
- );
2225
- const turnRequest = requests.find((request) => request.method === "turn/start");
2226
- expect(turnRequest?.params).toEqual(
2227
- expect.not.objectContaining({ serviceTier: expect.anything() }),
2228
- );
2229
- });
2230
-
2231
- it("builds resume and turn params from the currently selected OpenClaw model", () => {
2232
- const params = createParams("/tmp/session.jsonl", "/tmp/workspace");
2233
- const appServer = {
2234
- start: {
2235
- transport: "stdio" as const,
2236
- command: "codex",
2237
- args: ["app-server", "--listen", "stdio://"],
2238
- headers: {},
2239
- },
2240
- requestTimeoutMs: 60_000,
2241
- approvalPolicy: "on-request" as const,
2242
- approvalsReviewer: "guardian_subagent" as const,
2243
- sandbox: "danger-full-access" as const,
2244
- serviceTier: "flex" as const,
2245
- };
2246
-
2247
- expect(buildThreadResumeParams(params, { threadId: "thread-1", appServer })).toEqual({
2248
- threadId: "thread-1",
2249
- model: "gpt-5.4-codex",
2250
- approvalPolicy: "on-request",
2251
- approvalsReviewer: "guardian_subagent",
2252
- sandbox: "danger-full-access",
2253
- serviceTier: "flex",
2254
- developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
2255
- persistExtendedHistory: true,
2256
- });
2257
- expect(
2258
- buildTurnStartParams(params, { threadId: "thread-1", cwd: "/tmp/workspace", appServer }),
2259
- ).toEqual(
2260
- expect.objectContaining({
2261
- threadId: "thread-1",
2262
- cwd: "/tmp/workspace",
2263
- model: "gpt-5.4-codex",
2264
- approvalPolicy: "on-request",
2265
- approvalsReviewer: "guardian_subagent",
2266
- sandboxPolicy: { type: "dangerFullAccess" },
2267
- serviceTier: "flex",
2268
- }),
2269
- );
2270
- });
2271
-
2272
- it("preserves the bound auth profile when resume params omit authProfileId", async () => {
2273
- const sessionFile = path.join(tempDir, "session.jsonl");
2274
- const workspaceDir = path.join(tempDir, "workspace");
2275
- await writeExistingBinding(sessionFile, workspaceDir, {
2276
- authProfileId: "openai-codex:bound",
2277
- });
2278
- const params = createParams(sessionFile, workspaceDir);
2279
- delete params.authProfileId;
2280
- params.agentDir = path.join(tempDir, "agent");
2281
-
2282
- const binding = await startOrResumeThread({
2283
- client: {
2284
- request: async (method: string) => {
2285
- if (method === "thread/resume") {
2286
- return threadStartResult("thread-existing");
2287
- }
2288
- throw new Error(`unexpected method: ${method}`);
2289
- },
2290
- } as never,
2291
- params,
2292
- cwd: workspaceDir,
2293
- dynamicTools: [],
2294
- appServer: {
2295
- start: {
2296
- transport: "stdio",
2297
- command: "codex",
2298
- args: ["app-server"],
2299
- headers: {},
2300
- },
2301
- requestTimeoutMs: 60_000,
2302
- approvalPolicy: "never",
2303
- approvalsReviewer: "user",
2304
- sandbox: "workspace-write",
2305
- },
2306
- });
2307
-
2308
- expect(binding.authProfileId).toBe("openai-codex:bound");
2309
- });
2310
-
2311
- it("reuses the bound auth profile for app-server startup when params omit it", async () => {
2312
- const sessionFile = path.join(tempDir, "session.jsonl");
2313
- const workspaceDir = path.join(tempDir, "workspace");
2314
- await writeExistingBinding(sessionFile, workspaceDir, {
2315
- authProfileId: "openai-codex:bound",
2316
- dynamicToolsFingerprint: "[]",
2317
- });
2318
- const seenAuthProfileIds: Array<string | undefined> = [];
2319
- const seenAgentDirs: Array<string | undefined> = [];
2320
- const { requests, waitForMethod, completeTurn } = createAppServerHarness(
2321
- async (method: string) => {
2322
- if (method === "thread/resume") {
2323
- return threadStartResult("thread-existing");
2324
- }
2325
- if (method === "turn/start") {
2326
- return turnStartResult();
2327
- }
2328
- throw new Error(`unexpected method: ${method}`);
2329
- },
2330
- {
2331
- onStart: (authProfileId, agentDir) => {
2332
- seenAuthProfileIds.push(authProfileId);
2333
- seenAgentDirs.push(agentDir);
2334
- },
2335
- },
2336
- );
2337
- const params = createParams(sessionFile, workspaceDir);
2338
- delete params.authProfileId;
2339
- params.agentDir = path.join(tempDir, "agent");
2340
-
2341
- const run = runCodexAppServerAttempt(params);
2342
- await vi.waitFor(() => expect(seenAuthProfileIds).toEqual(["openai-codex:bound"]), {
2343
- interval: 1,
2344
- });
2345
- await waitForMethod("turn/start");
2346
- await new Promise<void>((resolve) => setImmediate(resolve));
2347
- await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
2348
- await run;
2349
-
2350
- expect(seenAuthProfileIds).toEqual(["openai-codex:bound"]);
2351
- expect(seenAgentDirs).toEqual([path.join(tempDir, "agent")]);
2352
- expect(requests.map((entry) => entry.method)).toContain("turn/start");
2353
- });
2354
- });