@gkorepanov/ccodex 0.4.19 → 0.4.23

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 (545) hide show
  1. package/README.md +4 -2
  2. package/agents/codex-wrapper.md +1 -0
  3. package/config/compatibility.json +5 -5
  4. package/dist/claude/inputMapper.d.ts +5 -0
  5. package/dist/claude/inputMapper.js +9 -0
  6. package/dist/claude/inputMapper.js.map +1 -1
  7. package/dist/claude/modelCatalog.d.ts +4 -0
  8. package/dist/claude/modelCatalog.js +14 -0
  9. package/dist/claude/modelCatalog.js.map +1 -1
  10. package/dist/claude/modelSelection.d.ts +14 -0
  11. package/dist/claude/modelSelection.js +26 -0
  12. package/dist/claude/modelSelection.js.map +1 -1
  13. package/dist/claude/rateLimits.d.ts +2 -1
  14. package/dist/claude/rateLimits.js +12 -16
  15. package/dist/claude/rateLimits.js.map +1 -1
  16. package/dist/claude/resultClassifier.js +4 -1
  17. package/dist/claude/resultClassifier.js.map +1 -1
  18. package/dist/claude/service.d.ts +66 -2
  19. package/dist/claude/service.js +301 -130
  20. package/dist/claude/service.js.map +1 -1
  21. package/dist/claude/session/codexRollout.js +40 -1
  22. package/dist/claude/session/codexRollout.js.map +1 -1
  23. package/dist/claude/session/commands.d.ts +44 -1
  24. package/dist/claude/session/goalState.d.ts +5 -0
  25. package/dist/claude/session/goalState.js +22 -0
  26. package/dist/claude/session/goalState.js.map +1 -1
  27. package/dist/claude/session/providerRuntimeFactory.js +13 -2
  28. package/dist/claude/session/providerRuntimeFactory.js.map +1 -1
  29. package/dist/claude/session/repository.d.ts +3 -0
  30. package/dist/claude/session/repository.js +2 -0
  31. package/dist/claude/session/repository.js.map +1 -1
  32. package/dist/claude/session/runtime.js +1 -1
  33. package/dist/claude/session/runtime.js.map +1 -1
  34. package/dist/claude/session/scopeState.js +1 -0
  35. package/dist/claude/session/scopeState.js.map +1 -1
  36. package/dist/claude/session/session.d.ts +1 -0
  37. package/dist/claude/session/session.js +171 -49
  38. package/dist/claude/session/session.js.map +1 -1
  39. package/dist/claude/skillCatalog.js +1 -0
  40. package/dist/claude/skillCatalog.js.map +1 -1
  41. package/dist/claude/statusCommand.js +1 -2
  42. package/dist/claude/statusCommand.js.map +1 -1
  43. package/dist/claude/toolMapper.js +1 -1
  44. package/dist/claude/toolMapper.js.map +1 -1
  45. package/dist/codex/generated/AuthMode.d.ts +1 -1
  46. package/dist/codex/generated/ClientRequest.d.ts +142 -1
  47. package/dist/codex/generated/ImageGenerationFailure.d.ts +5 -0
  48. package/dist/codex/generated/ImageGenerationFailure.js +3 -0
  49. package/dist/codex/generated/ImageGenerationFailure.js.map +1 -0
  50. package/dist/codex/generated/ImageGenerationItem.d.ts +3 -0
  51. package/dist/codex/generated/InitializeCapabilities.d.ts +10 -1
  52. package/dist/codex/generated/InternalSessionSource.d.ts +1 -1
  53. package/dist/codex/generated/PathUri.d.ts +4 -3
  54. package/dist/codex/generated/PlanType.d.ts +1 -1
  55. package/dist/codex/generated/ResponseItem.d.ts +4 -1
  56. package/dist/codex/generated/ResponseItemRuntimeSchema.js +2 -2
  57. package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -1
  58. package/dist/codex/generated/ReviewDecision.d.ts +1 -1
  59. package/dist/codex/generated/ServerNotification.d.ts +43 -0
  60. package/dist/codex/generated/ServerNotificationEnvelope.d.ts +43 -0
  61. package/dist/codex/generated/index.d.ts +1 -0
  62. package/dist/codex/generated/index.js.map +1 -1
  63. package/dist/codex/generated/v2/AccountLoginCompletedNotification.d.ts +2 -0
  64. package/dist/codex/generated/v2/AgentMessageDelivery.d.ts +1 -0
  65. package/dist/codex/generated/v2/AgentMessageDelivery.js +3 -0
  66. package/dist/codex/generated/v2/AgentMessageDelivery.js.map +1 -0
  67. package/dist/codex/generated/v2/AllowDenyRequirement.d.ts +1 -0
  68. package/dist/codex/generated/v2/AllowDenyRequirement.js +3 -0
  69. package/dist/codex/generated/v2/AllowDenyRequirement.js.map +1 -0
  70. package/dist/codex/generated/v2/AppLinksConfig.d.ts +11 -0
  71. package/dist/codex/generated/v2/AppLinksConfig.js +3 -0
  72. package/dist/codex/generated/v2/AppLinksConfig.js.map +1 -0
  73. package/dist/codex/generated/v2/AppsConfig.d.ts +5 -0
  74. package/dist/codex/generated/v2/AppsReadParams.d.ts +4 -0
  75. package/dist/codex/generated/v2/AsyncUserInputQuestion.d.ts +4 -0
  76. package/dist/codex/generated/v2/AsyncUserInputQuestion.js +3 -0
  77. package/dist/codex/generated/v2/AsyncUserInputQuestion.js.map +1 -0
  78. package/dist/codex/generated/v2/AuthRecoveryNotification.d.ts +6 -0
  79. package/dist/codex/generated/v2/AuthRecoveryNotification.js +3 -0
  80. package/dist/codex/generated/v2/AuthRecoveryNotification.js.map +1 -0
  81. package/dist/codex/generated/v2/AutoReviewRequirements.d.ts +4 -0
  82. package/dist/codex/generated/v2/AutoReviewRequirements.js +3 -0
  83. package/dist/codex/generated/v2/AutoReviewRequirements.js.map +1 -0
  84. package/dist/codex/generated/v2/AwsCredentialType.d.ts +1 -0
  85. package/dist/codex/generated/v2/AwsCredentialType.js +3 -0
  86. package/dist/codex/generated/v2/AwsCredentialType.js.map +1 -0
  87. package/dist/codex/generated/v2/BedrockAwsProfile.d.ts +4 -0
  88. package/dist/codex/generated/v2/BedrockAwsProfile.js +3 -0
  89. package/dist/codex/generated/v2/BedrockAwsProfile.js.map +1 -0
  90. package/dist/codex/generated/v2/BedrockDiscoverParams.d.ts +1 -0
  91. package/dist/codex/generated/v2/BedrockDiscoverParams.js +3 -0
  92. package/dist/codex/generated/v2/BedrockDiscoverParams.js.map +1 -0
  93. package/dist/codex/generated/v2/BedrockDiscoverResponse.d.ts +6 -0
  94. package/dist/codex/generated/v2/BedrockDiscoverResponse.js +3 -0
  95. package/dist/codex/generated/v2/BedrockDiscoverResponse.js.map +1 -0
  96. package/dist/codex/generated/v2/BedrockEnvironmentCredential.d.ts +5 -0
  97. package/dist/codex/generated/v2/BedrockEnvironmentCredential.js +3 -0
  98. package/dist/codex/generated/v2/BedrockEnvironmentCredential.js.map +1 -0
  99. package/dist/codex/generated/v2/BedrockSetupParams.d.ts +8 -0
  100. package/dist/codex/generated/v2/BedrockSetupParams.js +3 -0
  101. package/dist/codex/generated/v2/BedrockSetupParams.js.map +1 -0
  102. package/dist/codex/generated/v2/BedrockSetupResponse.d.ts +1 -0
  103. package/dist/codex/generated/v2/BedrockSetupResponse.js +3 -0
  104. package/dist/codex/generated/v2/BedrockSetupResponse.js.map +1 -0
  105. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.d.ts +1 -0
  106. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js +3 -0
  107. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js.map +1 -0
  108. package/dist/codex/generated/v2/BrowserUseConfig.d.ts +8 -0
  109. package/dist/codex/generated/v2/BrowserUseConfig.js +3 -0
  110. package/dist/codex/generated/v2/BrowserUseConfig.js.map +1 -0
  111. package/dist/codex/generated/v2/BrowserUseOriginPolicy.d.ts +11 -0
  112. package/dist/codex/generated/v2/BrowserUseOriginPolicy.js +3 -0
  113. package/dist/codex/generated/v2/BrowserUseOriginPolicy.js.map +1 -0
  114. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.d.ts +7 -0
  115. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js +3 -0
  116. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js.map +1 -0
  117. package/dist/codex/generated/v2/BrowserUseRequirements.d.ts +7 -0
  118. package/dist/codex/generated/v2/CliAuthCredentialsStoreMode.d.ts +1 -0
  119. package/dist/codex/generated/v2/CliAuthCredentialsStoreMode.js +3 -0
  120. package/dist/codex/generated/v2/CliAuthCredentialsStoreMode.js.map +1 -0
  121. package/dist/codex/generated/v2/CodexErrorInfo.d.ts +1 -1
  122. package/dist/codex/generated/v2/CollabAgentTool.d.ts +1 -1
  123. package/dist/codex/generated/v2/CollabAgentToolCallStatus.d.ts +1 -1
  124. package/dist/codex/generated/v2/CommandAction.d.ts +2 -2
  125. package/dist/codex/generated/v2/CommandExecutionApprovalKind.d.ts +4 -0
  126. package/dist/codex/generated/v2/CommandExecutionApprovalKind.js +3 -0
  127. package/dist/codex/generated/v2/CommandExecutionApprovalKind.js.map +1 -0
  128. package/dist/codex/generated/v2/CommandExecutionRequestApprovalParams.d.ts +6 -0
  129. package/dist/codex/generated/v2/ComputerUseConfig.d.ts +8 -0
  130. package/dist/codex/generated/v2/ComputerUseConfig.js +3 -0
  131. package/dist/codex/generated/v2/ComputerUseConfig.js.map +1 -0
  132. package/dist/codex/generated/v2/ComputerUseMacosConfig.d.ts +6 -0
  133. package/dist/codex/generated/v2/ComputerUseMacosConfig.js +3 -0
  134. package/dist/codex/generated/v2/ComputerUseMacosConfig.js.map +1 -0
  135. package/dist/codex/generated/v2/ComputerUseMacosRequirements.d.ts +6 -0
  136. package/dist/codex/generated/v2/ComputerUseMacosRequirements.js +3 -0
  137. package/dist/codex/generated/v2/ComputerUseMacosRequirements.js.map +1 -0
  138. package/dist/codex/generated/v2/ComputerUseRequirements.d.ts +7 -0
  139. package/dist/codex/generated/v2/ComputerUseWindowsConfig.d.ts +8 -0
  140. package/dist/codex/generated/v2/ComputerUseWindowsConfig.js +3 -0
  141. package/dist/codex/generated/v2/ComputerUseWindowsConfig.js.map +1 -0
  142. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.d.ts +7 -0
  143. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js +3 -0
  144. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js.map +1 -0
  145. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.d.ts +7 -0
  146. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js +3 -0
  147. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js.map +1 -0
  148. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.d.ts +8 -0
  149. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js +3 -0
  150. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js.map +1 -0
  151. package/dist/codex/generated/v2/Config.d.ts +4 -0
  152. package/dist/codex/generated/v2/ConfigLayerSource.d.ts +6 -0
  153. package/dist/codex/generated/v2/ConfigRequirements.d.ts +9 -0
  154. package/dist/codex/generated/v2/ConfiguredHookHandler.d.ts +10 -0
  155. package/dist/codex/generated/v2/CyberAccessProgram.d.ts +5 -0
  156. package/dist/codex/generated/v2/CyberAccessProgram.js +3 -0
  157. package/dist/codex/generated/v2/CyberAccessProgram.js.map +1 -0
  158. package/dist/codex/generated/v2/DesktopOnboardingEntrypoint.d.ts +1 -0
  159. package/dist/codex/generated/v2/DesktopOnboardingEntrypoint.js +3 -0
  160. package/dist/codex/generated/v2/DesktopOnboardingEntrypoint.js.map +1 -0
  161. package/dist/codex/generated/v2/ExternalAgentConfigDetectResponse.d.ts +2 -0
  162. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordParams.d.ts +2 -2
  163. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.d.ts +11 -0
  164. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.js +3 -0
  165. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.js.map +1 -0
  166. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.d.ts +8 -0
  167. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.js +3 -0
  168. package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.js.map +1 -0
  169. package/dist/codex/generated/v2/ExternalAgentConfigImportItemTypeSuccess.d.ts +4 -0
  170. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.d.ts +6 -0
  171. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.js +3 -0
  172. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.js.map +1 -0
  173. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.d.ts +1 -0
  174. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.js +3 -0
  175. package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.js.map +1 -0
  176. package/dist/codex/generated/v2/GetAccountRateLimitsResponse.d.ts +10 -0
  177. package/dist/codex/generated/v2/GetAccountTokenUsageParams.d.ts +6 -0
  178. package/dist/codex/generated/v2/GetAccountTokenUsageParams.js +3 -0
  179. package/dist/codex/generated/v2/GetAccountTokenUsageParams.js.map +1 -0
  180. package/dist/codex/generated/v2/GetAccountTokenUsageResponse.d.ts +5 -0
  181. package/dist/codex/generated/v2/GuardianApprovalReviewAction.d.ts +7 -0
  182. package/dist/codex/generated/v2/HookEventName.d.ts +1 -1
  183. package/dist/codex/generated/v2/HookHandlerType.d.ts +1 -1
  184. package/dist/codex/generated/v2/HookMetadata.d.ts +13 -4
  185. package/dist/codex/generated/v2/InAppBrowserRequirements.d.ts +3 -0
  186. package/dist/codex/generated/v2/InAppBrowserRequirements.js +3 -0
  187. package/dist/codex/generated/v2/InAppBrowserRequirements.js.map +1 -0
  188. package/dist/codex/generated/v2/ItemGuardianApprovalReviewCompletedNotification.d.ts +2 -0
  189. package/dist/codex/generated/v2/ItemGuardianApprovalReviewStartedNotification.d.ts +2 -0
  190. package/dist/codex/generated/v2/LoginAccountParams.d.ts +6 -0
  191. package/dist/codex/generated/v2/ManagedHooksRequirements.d.ts +1 -0
  192. package/dist/codex/generated/v2/McpAuthStatus.d.ts +1 -1
  193. package/dist/codex/generated/v2/McpResourceReadParams.d.ts +5 -0
  194. package/dist/codex/generated/v2/McpResourceReadResponse.d.ts +4 -0
  195. package/dist/codex/generated/v2/McpServerConnectionStatus.d.ts +1 -0
  196. package/dist/codex/generated/v2/McpServerConnectionStatus.js +3 -0
  197. package/dist/codex/generated/v2/McpServerConnectionStatus.js.map +1 -0
  198. package/dist/codex/generated/v2/McpServerElicitationRequestParams.d.ts +5 -0
  199. package/dist/codex/generated/v2/McpServerEventNotification.d.ts +5 -0
  200. package/dist/codex/generated/v2/McpServerEventNotification.js +3 -0
  201. package/dist/codex/generated/v2/McpServerEventNotification.js.map +1 -0
  202. package/dist/codex/generated/v2/McpServerEventStreamNotification.d.ts +5 -0
  203. package/dist/codex/generated/v2/McpServerEventStreamNotification.js +3 -0
  204. package/dist/codex/generated/v2/McpServerEventStreamNotification.js.map +1 -0
  205. package/dist/codex/generated/v2/McpServerEventStreamStartParams.d.ts +9 -0
  206. package/dist/codex/generated/v2/McpServerEventStreamStartParams.js +3 -0
  207. package/dist/codex/generated/v2/McpServerEventStreamStartParams.js.map +1 -0
  208. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.d.ts +1 -0
  209. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js +3 -0
  210. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js.map +1 -0
  211. package/dist/codex/generated/v2/McpServerEventStreamStopParams.d.ts +3 -0
  212. package/dist/codex/generated/v2/McpServerEventStreamStopParams.js +3 -0
  213. package/dist/codex/generated/v2/McpServerEventStreamStopParams.js.map +1 -0
  214. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.d.ts +1 -0
  215. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js +3 -0
  216. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js.map +1 -0
  217. package/dist/codex/generated/v2/McpServerOauthClientRegistration.d.ts +1 -0
  218. package/dist/codex/generated/v2/McpServerOauthClientRegistration.js +3 -0
  219. package/dist/codex/generated/v2/McpServerOauthClientRegistration.js.map +1 -0
  220. package/dist/codex/generated/v2/McpServerOauthLoginParams.d.ts +5 -0
  221. package/dist/codex/generated/v2/McpServerStatus.d.ts +6 -0
  222. package/dist/codex/generated/v2/MisalignmentErrorDetails.d.ts +15 -0
  223. package/dist/codex/generated/v2/MisalignmentErrorDetails.js +3 -0
  224. package/dist/codex/generated/v2/MisalignmentErrorDetails.js.map +1 -0
  225. package/dist/codex/generated/v2/MisalignmentSteer.d.ts +3 -0
  226. package/dist/codex/generated/v2/MisalignmentSteer.js +3 -0
  227. package/dist/codex/generated/v2/MisalignmentSteer.js.map +1 -0
  228. package/dist/codex/generated/v2/Model.d.ts +6 -0
  229. package/dist/codex/generated/v2/ModelUpgradeInfo.d.ts +4 -0
  230. package/dist/codex/generated/v2/MultiAgentVersion.d.ts +4 -0
  231. package/dist/codex/generated/v2/MultiAgentVersion.js +3 -0
  232. package/dist/codex/generated/v2/MultiAgentVersion.js.map +1 -0
  233. package/dist/codex/generated/v2/PluginDisabledReason.d.ts +1 -0
  234. package/dist/codex/generated/v2/PluginDisabledReason.js +3 -0
  235. package/dist/codex/generated/v2/PluginDisabledReason.js.map +1 -0
  236. package/dist/codex/generated/v2/PluginInstallParams.d.ts +4 -0
  237. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.d.ts +19 -0
  238. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js +3 -0
  239. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js.map +1 -0
  240. package/dist/codex/generated/v2/PluginReconcileParams.d.ts +6 -0
  241. package/dist/codex/generated/v2/PluginReconcileParams.js +3 -0
  242. package/dist/codex/generated/v2/PluginReconcileParams.js.map +1 -0
  243. package/dist/codex/generated/v2/PluginReconcileResponse.d.ts +23 -0
  244. package/dist/codex/generated/v2/PluginReconcileResponse.js +3 -0
  245. package/dist/codex/generated/v2/PluginReconcileResponse.js.map +1 -0
  246. package/dist/codex/generated/v2/PluginSearchParams.d.ts +9 -0
  247. package/dist/codex/generated/v2/PluginSearchParams.js +3 -0
  248. package/dist/codex/generated/v2/PluginSearchParams.js.map +1 -0
  249. package/dist/codex/generated/v2/PluginSearchResponse.d.ts +5 -0
  250. package/dist/codex/generated/v2/PluginSearchResponse.js +3 -0
  251. package/dist/codex/generated/v2/PluginSearchResponse.js.map +1 -0
  252. package/dist/codex/generated/v2/PluginSearchResult.d.ts +7 -0
  253. package/dist/codex/generated/v2/PluginSearchResult.js +3 -0
  254. package/dist/codex/generated/v2/PluginSearchResult.js.map +1 -0
  255. package/dist/codex/generated/v2/PluginSearchScope.d.ts +1 -0
  256. package/dist/codex/generated/v2/PluginSearchScope.js +3 -0
  257. package/dist/codex/generated/v2/PluginSearchScope.js.map +1 -0
  258. package/dist/codex/generated/v2/PluginSummary.d.ts +13 -0
  259. package/dist/codex/generated/v2/Project.d.ts +16 -0
  260. package/dist/codex/generated/v2/Project.js +3 -0
  261. package/dist/codex/generated/v2/Project.js.map +1 -0
  262. package/dist/codex/generated/v2/ProjectChangeType.d.ts +1 -0
  263. package/dist/codex/generated/v2/ProjectChangeType.js +3 -0
  264. package/dist/codex/generated/v2/ProjectChangeType.js.map +1 -0
  265. package/dist/codex/generated/v2/ProjectChangedNotification.d.ts +5 -0
  266. package/dist/codex/generated/v2/ProjectChangedNotification.js +3 -0
  267. package/dist/codex/generated/v2/ProjectChangedNotification.js.map +1 -0
  268. package/dist/codex/generated/v2/ProjectCreateParams.d.ts +9 -0
  269. package/dist/codex/generated/v2/ProjectCreateParams.js +3 -0
  270. package/dist/codex/generated/v2/ProjectCreateParams.js.map +1 -0
  271. package/dist/codex/generated/v2/ProjectCreateResponse.d.ts +4 -0
  272. package/dist/codex/generated/v2/ProjectCreateResponse.js +3 -0
  273. package/dist/codex/generated/v2/ProjectCreateResponse.js.map +1 -0
  274. package/dist/codex/generated/v2/ProjectDeleteParams.d.ts +3 -0
  275. package/dist/codex/generated/v2/ProjectDeleteParams.js +3 -0
  276. package/dist/codex/generated/v2/ProjectDeleteParams.js.map +1 -0
  277. package/dist/codex/generated/v2/ProjectDeleteResponse.d.ts +1 -0
  278. package/dist/codex/generated/v2/ProjectDeleteResponse.js +3 -0
  279. package/dist/codex/generated/v2/ProjectDeleteResponse.js.map +1 -0
  280. package/dist/codex/generated/v2/ProjectImportParams.d.ts +10 -0
  281. package/dist/codex/generated/v2/ProjectImportParams.js +3 -0
  282. package/dist/codex/generated/v2/ProjectImportParams.js.map +1 -0
  283. package/dist/codex/generated/v2/ProjectImportResponse.d.ts +4 -0
  284. package/dist/codex/generated/v2/ProjectImportResponse.js +3 -0
  285. package/dist/codex/generated/v2/ProjectImportResponse.js.map +1 -0
  286. package/dist/codex/generated/v2/ProjectListParams.d.ts +14 -0
  287. package/dist/codex/generated/v2/ProjectListParams.js +3 -0
  288. package/dist/codex/generated/v2/ProjectListParams.js.map +1 -0
  289. package/dist/codex/generated/v2/ProjectListResponse.d.ts +5 -0
  290. package/dist/codex/generated/v2/ProjectListResponse.js +3 -0
  291. package/dist/codex/generated/v2/ProjectListResponse.js.map +1 -0
  292. package/dist/codex/generated/v2/ProjectMoveParams.d.ts +4 -0
  293. package/dist/codex/generated/v2/ProjectMoveParams.js +3 -0
  294. package/dist/codex/generated/v2/ProjectMoveParams.js.map +1 -0
  295. package/dist/codex/generated/v2/ProjectMoveResponse.d.ts +1 -0
  296. package/dist/codex/generated/v2/ProjectMoveResponse.js +3 -0
  297. package/dist/codex/generated/v2/ProjectMoveResponse.js.map +1 -0
  298. package/dist/codex/generated/v2/ProjectReadParams.d.ts +3 -0
  299. package/dist/codex/generated/v2/ProjectReadParams.js +3 -0
  300. package/dist/codex/generated/v2/ProjectReadParams.js.map +1 -0
  301. package/dist/codex/generated/v2/ProjectReadResponse.d.ts +4 -0
  302. package/dist/codex/generated/v2/ProjectReadResponse.js +3 -0
  303. package/dist/codex/generated/v2/ProjectReadResponse.js.map +1 -0
  304. package/dist/codex/generated/v2/ProjectRoot.d.ts +4 -0
  305. package/dist/codex/generated/v2/ProjectRoot.js +3 -0
  306. package/dist/codex/generated/v2/ProjectRoot.js.map +1 -0
  307. package/dist/codex/generated/v2/ProjectSortKey.d.ts +1 -0
  308. package/dist/codex/generated/v2/ProjectSortKey.js +3 -0
  309. package/dist/codex/generated/v2/ProjectSortKey.js.map +1 -0
  310. package/dist/codex/generated/v2/ProjectUpdateParams.d.ts +9 -0
  311. package/dist/codex/generated/v2/ProjectUpdateParams.js +3 -0
  312. package/dist/codex/generated/v2/ProjectUpdateParams.js.map +1 -0
  313. package/dist/codex/generated/v2/ProjectUpdateResponse.d.ts +4 -0
  314. package/dist/codex/generated/v2/ProjectUpdateResponse.js +3 -0
  315. package/dist/codex/generated/v2/ProjectUpdateResponse.js.map +1 -0
  316. package/dist/codex/generated/v2/QueuedSubmission.d.ts +6 -0
  317. package/dist/codex/generated/v2/QueuedSubmission.js +3 -0
  318. package/dist/codex/generated/v2/QueuedSubmission.js.map +1 -0
  319. package/dist/codex/generated/v2/RawResponseCompletedNotification.d.ts +2 -0
  320. package/dist/codex/generated/v2/ResponseUsageMetadata.d.ts +8 -0
  321. package/dist/codex/generated/v2/ResponseUsageMetadata.js +3 -0
  322. package/dist/codex/generated/v2/ResponseUsageMetadata.js.map +1 -0
  323. package/dist/codex/generated/v2/ServerDiagnosticsGauge.d.ts +4 -0
  324. package/dist/codex/generated/v2/ServerDiagnosticsGauge.js +3 -0
  325. package/dist/codex/generated/v2/ServerDiagnosticsGauge.js.map +1 -0
  326. package/dist/codex/generated/v2/ServerDiagnosticsParams.d.ts +1 -0
  327. package/dist/codex/generated/v2/ServerDiagnosticsParams.js +3 -0
  328. package/dist/codex/generated/v2/ServerDiagnosticsParams.js.map +1 -0
  329. package/dist/codex/generated/v2/ServerDiagnosticsProcess.d.ts +5 -0
  330. package/dist/codex/generated/v2/ServerDiagnosticsProcess.js +3 -0
  331. package/dist/codex/generated/v2/ServerDiagnosticsProcess.js.map +1 -0
  332. package/dist/codex/generated/v2/ServerDiagnosticsResponse.d.ts +6 -0
  333. package/dist/codex/generated/v2/ServerDiagnosticsResponse.js +3 -0
  334. package/dist/codex/generated/v2/ServerDiagnosticsResponse.js.map +1 -0
  335. package/dist/codex/generated/v2/SkillMetadata.d.ts +4 -0
  336. package/dist/codex/generated/v2/StrictReviewRequiredNotification.d.ts +8 -0
  337. package/dist/codex/generated/v2/StrictReviewRequiredNotification.js +3 -0
  338. package/dist/codex/generated/v2/StrictReviewRequiredNotification.js.map +1 -0
  339. package/dist/codex/generated/v2/SubAgentActivityKind.d.ts +1 -1
  340. package/dist/codex/generated/v2/Thread.d.ts +22 -2
  341. package/dist/codex/generated/v2/ThreadBackgroundTerminal.d.ts +2 -2
  342. package/dist/codex/generated/v2/ThreadForkParams.d.ts +3 -1
  343. package/dist/codex/generated/v2/ThreadItem.d.ts +12 -0
  344. package/dist/codex/generated/v2/ThreadListParams.d.ts +8 -2
  345. package/dist/codex/generated/v2/ThreadMetadataUpdateParams.d.ts +5 -4
  346. package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.d.ts +4 -0
  347. package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.js +3 -0
  348. package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.js.map +1 -0
  349. package/dist/codex/generated/v2/ThreadQueueAddParams.d.ts +6 -0
  350. package/dist/codex/generated/v2/ThreadQueueAddParams.js +3 -0
  351. package/dist/codex/generated/v2/ThreadQueueAddParams.js.map +1 -0
  352. package/dist/codex/generated/v2/ThreadQueueAddResponse.d.ts +4 -0
  353. package/dist/codex/generated/v2/ThreadQueueAddResponse.js +3 -0
  354. package/dist/codex/generated/v2/ThreadQueueAddResponse.js.map +1 -0
  355. package/dist/codex/generated/v2/ThreadQueueChangedNotification.d.ts +3 -0
  356. package/dist/codex/generated/v2/ThreadQueueChangedNotification.js +3 -0
  357. package/dist/codex/generated/v2/ThreadQueueChangedNotification.js.map +1 -0
  358. package/dist/codex/generated/v2/ThreadQueueDeleteParams.d.ts +4 -0
  359. package/dist/codex/generated/v2/ThreadQueueDeleteParams.js +3 -0
  360. package/dist/codex/generated/v2/ThreadQueueDeleteParams.js.map +1 -0
  361. package/dist/codex/generated/v2/ThreadQueueDeleteResponse.d.ts +3 -0
  362. package/dist/codex/generated/v2/ThreadQueueDeleteResponse.js +3 -0
  363. package/dist/codex/generated/v2/ThreadQueueDeleteResponse.js.map +1 -0
  364. package/dist/codex/generated/v2/ThreadQueueListParams.d.ts +11 -0
  365. package/dist/codex/generated/v2/ThreadQueueListParams.js +3 -0
  366. package/dist/codex/generated/v2/ThreadQueueListParams.js.map +1 -0
  367. package/dist/codex/generated/v2/ThreadQueueListResponse.d.ts +8 -0
  368. package/dist/codex/generated/v2/ThreadQueueListResponse.js +3 -0
  369. package/dist/codex/generated/v2/ThreadQueueListResponse.js.map +1 -0
  370. package/dist/codex/generated/v2/ThreadQueueReorderParams.d.ts +4 -0
  371. package/dist/codex/generated/v2/ThreadQueueReorderParams.js +3 -0
  372. package/dist/codex/generated/v2/ThreadQueueReorderParams.js.map +1 -0
  373. package/dist/codex/generated/v2/ThreadQueueReorderResponse.d.ts +1 -0
  374. package/dist/codex/generated/v2/ThreadQueueReorderResponse.js +3 -0
  375. package/dist/codex/generated/v2/ThreadQueueReorderResponse.js.map +1 -0
  376. package/dist/codex/generated/v2/ThreadQueueStartParams.d.ts +4 -0
  377. package/dist/codex/generated/v2/ThreadQueueStartParams.js +3 -0
  378. package/dist/codex/generated/v2/ThreadQueueStartParams.js.map +1 -0
  379. package/dist/codex/generated/v2/ThreadQueueStartResponse.d.ts +4 -0
  380. package/dist/codex/generated/v2/ThreadQueueStartResponse.js +3 -0
  381. package/dist/codex/generated/v2/ThreadQueueStartResponse.js.map +1 -0
  382. package/dist/codex/generated/v2/ThreadQueueUpdateParams.d.ts +6 -0
  383. package/dist/codex/generated/v2/ThreadQueueUpdateParams.js +3 -0
  384. package/dist/codex/generated/v2/ThreadQueueUpdateParams.js.map +1 -0
  385. package/dist/codex/generated/v2/ThreadQueueUpdateResponse.d.ts +4 -0
  386. package/dist/codex/generated/v2/ThreadQueueUpdateResponse.js +3 -0
  387. package/dist/codex/generated/v2/ThreadQueueUpdateResponse.js.map +1 -0
  388. package/dist/codex/generated/v2/ThreadReadParams.d.ts +3 -0
  389. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.d.ts +11 -0
  390. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js +3 -0
  391. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js.map +1 -0
  392. package/dist/codex/generated/v2/ThreadRealtimeItem.d.ts +24 -0
  393. package/dist/codex/generated/v2/ThreadRealtimeItem.js +3 -0
  394. package/dist/codex/generated/v2/ThreadRealtimeItem.js.map +1 -0
  395. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.d.ts +8 -0
  396. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js +3 -0
  397. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js.map +1 -0
  398. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.d.ts +8 -0
  399. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js +3 -0
  400. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js.map +1 -0
  401. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.d.ts +8 -0
  402. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js +3 -0
  403. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js.map +1 -0
  404. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.d.ts +1 -0
  405. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js +3 -0
  406. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js.map +1 -0
  407. package/dist/codex/generated/v2/ThreadRealtimeStartParams.d.ts +13 -0
  408. package/dist/codex/generated/v2/ThreadRealtimeStartTransport.d.ts +6 -0
  409. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.d.ts +1 -0
  410. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js +3 -0
  411. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js.map +1 -0
  412. package/dist/codex/generated/v2/ThreadResumeParams.d.ts +3 -1
  413. package/dist/codex/generated/v2/ThreadResumeResponse.d.ts +4 -4
  414. package/dist/codex/generated/v2/ThreadRevertParams.d.ts +12 -0
  415. package/dist/codex/generated/v2/ThreadRevertParams.js +3 -0
  416. package/dist/codex/generated/v2/ThreadRevertParams.js.map +1 -0
  417. package/dist/codex/generated/v2/ThreadRevertResponse.d.ts +22 -0
  418. package/dist/codex/generated/v2/ThreadRevertResponse.js +3 -0
  419. package/dist/codex/generated/v2/ThreadRevertResponse.js.map +1 -0
  420. package/dist/codex/generated/v2/ThreadRevertedNotification.d.ts +3 -0
  421. package/dist/codex/generated/v2/ThreadRevertedNotification.js +3 -0
  422. package/dist/codex/generated/v2/ThreadRevertedNotification.js.map +1 -0
  423. package/dist/codex/generated/v2/ThreadSearchParams.d.ts +2 -2
  424. package/dist/codex/generated/v2/ThreadSearchSortKey.d.ts +1 -0
  425. package/dist/codex/generated/v2/ThreadSearchSortKey.js +3 -0
  426. package/dist/codex/generated/v2/ThreadSearchSortKey.js.map +1 -0
  427. package/dist/codex/generated/v2/ThreadSection.d.ts +18 -0
  428. package/dist/codex/generated/v2/ThreadSection.js +3 -0
  429. package/dist/codex/generated/v2/ThreadSection.js.map +1 -0
  430. package/dist/codex/generated/v2/ThreadSectionAppearance.d.ts +7 -0
  431. package/dist/codex/generated/v2/ThreadSectionAppearance.js +3 -0
  432. package/dist/codex/generated/v2/ThreadSectionAppearance.js.map +1 -0
  433. package/dist/codex/generated/v2/ThreadSectionCreateParams.d.ts +11 -0
  434. package/dist/codex/generated/v2/ThreadSectionCreateParams.js +3 -0
  435. package/dist/codex/generated/v2/ThreadSectionCreateParams.js.map +1 -0
  436. package/dist/codex/generated/v2/ThreadSectionCreateResponse.d.ts +7 -0
  437. package/dist/codex/generated/v2/ThreadSectionCreateResponse.js +3 -0
  438. package/dist/codex/generated/v2/ThreadSectionCreateResponse.js.map +1 -0
  439. package/dist/codex/generated/v2/ThreadSectionDeleteParams.d.ts +9 -0
  440. package/dist/codex/generated/v2/ThreadSectionDeleteParams.js +3 -0
  441. package/dist/codex/generated/v2/ThreadSectionDeleteParams.js.map +1 -0
  442. package/dist/codex/generated/v2/ThreadSectionDeleteResponse.d.ts +4 -0
  443. package/dist/codex/generated/v2/ThreadSectionDeleteResponse.js +3 -0
  444. package/dist/codex/generated/v2/ThreadSectionDeleteResponse.js.map +1 -0
  445. package/dist/codex/generated/v2/ThreadSectionListParams.d.ts +13 -0
  446. package/dist/codex/generated/v2/ThreadSectionListParams.js +3 -0
  447. package/dist/codex/generated/v2/ThreadSectionListParams.js.map +1 -0
  448. package/dist/codex/generated/v2/ThreadSectionListResponse.d.ts +11 -0
  449. package/dist/codex/generated/v2/ThreadSectionListResponse.js +3 -0
  450. package/dist/codex/generated/v2/ThreadSectionListResponse.js.map +1 -0
  451. package/dist/codex/generated/v2/ThreadSectionMoveParams.d.ts +17 -0
  452. package/dist/codex/generated/v2/ThreadSectionMoveParams.js +3 -0
  453. package/dist/codex/generated/v2/ThreadSectionMoveParams.js.map +1 -0
  454. package/dist/codex/generated/v2/ThreadSectionMoveResponse.d.ts +1 -0
  455. package/dist/codex/generated/v2/ThreadSectionMoveResponse.js +3 -0
  456. package/dist/codex/generated/v2/ThreadSectionMoveResponse.js.map +1 -0
  457. package/dist/codex/generated/v2/ThreadSectionUpdateParams.d.ts +18 -0
  458. package/dist/codex/generated/v2/ThreadSectionUpdateParams.js +3 -0
  459. package/dist/codex/generated/v2/ThreadSectionUpdateParams.js.map +1 -0
  460. package/dist/codex/generated/v2/ThreadSectionUpdateResponse.d.ts +7 -0
  461. package/dist/codex/generated/v2/ThreadSectionUpdateResponse.js +3 -0
  462. package/dist/codex/generated/v2/ThreadSectionUpdateResponse.js.map +1 -0
  463. package/dist/codex/generated/v2/ThreadShellCommandParams.d.ts +6 -0
  464. package/dist/codex/generated/v2/ThreadSortKey.d.ts +1 -1
  465. package/dist/codex/generated/v2/ThreadStartParams.d.ts +5 -0
  466. package/dist/codex/generated/v2/ThreadTimelineEntry.d.ts +31 -0
  467. package/dist/codex/generated/v2/ThreadTimelineEntry.js +3 -0
  468. package/dist/codex/generated/v2/ThreadTimelineEntry.js.map +1 -0
  469. package/dist/codex/generated/v2/ThreadTimelineListParams.d.ts +8 -0
  470. package/dist/codex/generated/v2/ThreadTimelineListParams.js +3 -0
  471. package/dist/codex/generated/v2/ThreadTimelineListParams.js.map +1 -0
  472. package/dist/codex/generated/v2/ThreadTimelineListResponse.d.ts +9 -0
  473. package/dist/codex/generated/v2/ThreadTimelineListResponse.js +3 -0
  474. package/dist/codex/generated/v2/ThreadTimelineListResponse.js.map +1 -0
  475. package/dist/codex/generated/v2/ThreadUsage.d.ts +7 -0
  476. package/dist/codex/generated/v2/ThreadUsage.js +3 -0
  477. package/dist/codex/generated/v2/ThreadUsage.js.map +1 -0
  478. package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.d.ts +11 -0
  479. package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.js +3 -0
  480. package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.js.map +1 -0
  481. package/dist/codex/generated/v2/ToolRequestUserInputParams.d.ts +4 -0
  482. package/dist/codex/generated/v2/TurnError.d.ts +5 -0
  483. package/dist/codex/generated/v2/TurnSettingsUpdateParams.d.ts +34 -0
  484. package/dist/codex/generated/v2/TurnSettingsUpdateParams.js +3 -0
  485. package/dist/codex/generated/v2/TurnSettingsUpdateParams.js.map +1 -0
  486. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.d.ts +4 -0
  487. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js +3 -0
  488. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js.map +1 -0
  489. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.d.ts +1 -0
  490. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js +3 -0
  491. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js.map +1 -0
  492. package/dist/codex/generated/v2/TurnStartParams.d.ts +19 -0
  493. package/dist/codex/generated/v2/TurnToolOutput.d.ts +6 -0
  494. package/dist/codex/generated/v2/TurnToolOutput.js +3 -0
  495. package/dist/codex/generated/v2/TurnToolOutput.js.map +1 -0
  496. package/dist/codex/generated/v2/index.d.ts +125 -0
  497. package/dist/daemon/probe.js +1 -1
  498. package/dist/gateway/clientConnection.js +129 -24
  499. package/dist/gateway/clientConnection.js.map +1 -1
  500. package/dist/gateway/remoteRelay.js +2 -2
  501. package/dist/gateway/remoteRelay.js.map +1 -1
  502. package/dist/gateway/stockRpc.d.ts +2 -0
  503. package/dist/gateway/stockRpc.js +13 -0
  504. package/dist/gateway/stockRpc.js.map +1 -1
  505. package/dist/gateway/threadList.d.ts +6 -0
  506. package/dist/gateway/threadList.js +58 -12
  507. package/dist/gateway/threadList.js.map +1 -1
  508. package/dist/gateway/transientNotice.js +6 -4
  509. package/dist/gateway/transientNotice.js.map +1 -1
  510. package/dist/handoff/lineageStore.d.ts +2 -8
  511. package/dist/handoff/lineageStore.js +2 -8
  512. package/dist/handoff/lineageStore.js.map +1 -1
  513. package/dist/handoff/providerEpochs.js +4 -5
  514. package/dist/handoff/providerEpochs.js.map +1 -1
  515. package/dist/handoff/service.d.ts +16 -3
  516. package/dist/handoff/service.js +196 -125
  517. package/dist/handoff/service.js.map +1 -1
  518. package/dist/handoff/titleGeneration.d.ts +1 -0
  519. package/dist/handoff/titleGeneration.js.map +1 -1
  520. package/dist/management/setup.d.ts +6 -0
  521. package/dist/management/setup.js +11 -3
  522. package/dist/management/setup.js.map +1 -1
  523. package/dist/protocol/search.d.ts +24 -0
  524. package/dist/protocol/search.js +105 -0
  525. package/dist/protocol/search.js.map +1 -0
  526. package/dist/protocol/turnPagination.d.ts +16 -0
  527. package/dist/protocol/turnPagination.js +75 -35
  528. package/dist/protocol/turnPagination.js.map +1 -1
  529. package/dist/runtime/dependencies.js +1 -1
  530. package/dist/store/HybridStore.d.ts +4 -0
  531. package/dist/store/HybridStore.js +1 -1
  532. package/dist/store/HybridStore.js.map +1 -1
  533. package/dist/store/memoryStore.d.ts +6 -0
  534. package/dist/store/memoryStore.js +16 -0
  535. package/dist/store/memoryStore.js.map +1 -1
  536. package/dist/store/sqliteStore.d.ts +3 -0
  537. package/dist/store/sqliteStore.js +60 -1
  538. package/dist/store/sqliteStore.js.map +1 -1
  539. package/dist/store/threadFilter.js +11 -2
  540. package/dist/store/threadFilter.js.map +1 -1
  541. package/legal/THIRD_PARTY_NOTICES.md +304 -263
  542. package/package.json +6 -6
  543. package/scripts/install-claude-stack.sh +27 -4
  544. package/skills/workforce/SKILL.md +51 -24
  545. package/vendor/codex/continuation.md +5 -0
@@ -7,14 +7,15 @@ import { SqliteHybridStore } from "../store/sqliteStore.js";
7
7
  import { LayeredHybridStore } from "../store/memoryStore.js";
8
8
  import { createClaudeQuery } from "./queryFactory.js";
9
9
  import { claudeEnvironment } from "./environment.js";
10
- import { invalidParams } from "../protocol/errors.js";
11
- import { paginateTurns, turnCursor } from "../protocol/turnPagination.js";
10
+ import { invalidParams, invalidRequest } from "../protocol/errors.js";
11
+ import { historyCursors, paginateItems, paginateTurns, startedTurn } from "../protocol/turnPagination.js";
12
+ import { searchTurnOccurrences, threadSearchSnippet } from "../protocol/search.js";
12
13
  import { MetricsRegistry } from "../observability/metrics.js";
13
14
  import { SdkTranscriptBrancher, } from "./transcriptBrancher.js";
14
15
  import { ClaudeRateLimitCoordinator, } from "./rateLimits.js";
15
16
  import { isClaudeStatusCommand } from "./statusCommand.js";
16
17
  import { systemNoticeText } from "../gateway/transientNotice.js";
17
- import { claudeCatalogId, normalizeClaudeModelIdentifier, normalizeClaudeServiceTier, resolveClaudeModel, } from "./modelSelection.js";
18
+ import { claudeCatalogId, normalizeClaudeModelIdentifier, normalizeClaudeServiceTier, pickClaudeModelReplacement, resolveClaudeModel, } from "./modelSelection.js";
18
19
  import { ClaudeOutputAdapter } from "./session/outputAdapter.js";
19
20
  import { branchRevision, ClaudeSessionRepository } from "./session/repository.js";
20
21
  import { ActiveClaudeTurnError, ClaudeSession } from "./session/session.js";
@@ -159,7 +160,9 @@ function threadResponse(record, includeTurns) {
159
160
  ...settings,
160
161
  thread: {
161
162
  ...record.thread,
162
- isPinned: record.thread.isPinned ?? false,
163
+ section: record.thread.section ?? null,
164
+ sectionEnteredAt: record.thread.sectionEnteredAt ?? null,
165
+ projectId: record.thread.projectId ?? null,
163
166
  canAcceptDirectInput: record.thread.parentThreadId ? false : true,
164
167
  turns: includeTurns ? record.thread.turns : [],
165
168
  },
@@ -255,6 +258,8 @@ export class ClaudeService {
255
258
  nativeSessionCatalog;
256
259
  ephemeralReleases = new Map();
257
260
  ephemeralReleaseTimers = new Map();
261
+ /** Root threads whose last turn completed or failed and whose queue drains once the session is quiescent. */
262
+ queueDrainPending = new Set();
258
263
  removalRetries = new Map();
259
264
  terminalAdmins = new Map();
260
265
  settingsUpdates = new Map();
@@ -290,7 +295,7 @@ export class ClaudeService {
290
295
  const sessionRepository = new ClaudeSessionRepository(this.store);
291
296
  this.sessionOutput = new ClaudeOutputAdapter(hub);
292
297
  this.rateLimits = new ClaudeRateLimitCoordinator(logger);
293
- this.sessions = new ClaudeSessionRegistry((threadId) => new ClaudeSession(threadId, sessionRepository, this.sessionOutput, undefined, metrics, undefined, (childThreadId) => this.sessions.registerChild(childThreadId, threadId), (childThreadId) => this.sessions.unregisterChild(childThreadId), shellRunner, undefined, {
298
+ this.sessions = new ClaudeSessionRegistry((threadId) => new ClaudeSession(threadId, sessionRepository, this.sessionOutput, undefined, metrics, (update) => this.onSessionLifecycle(threadId, update), (childThreadId) => this.sessions.registerChild(childThreadId, threadId), (childThreadId) => this.sessions.unregisterChild(childThreadId), shellRunner, undefined, {
294
299
  claudeBinary: this.config.claudeBinary,
295
300
  logger: this.logger,
296
301
  queryFactory: this.queryFactory,
@@ -303,10 +308,12 @@ export class ClaudeService {
303
308
  interactiveQuestions: this.config.features?.interactiveQuestions ?? true,
304
309
  resolveChildModel: (model) => {
305
310
  const value = normalizeClaudeModelIdentifier(model);
306
- const modelPickerId = this.modelCatalog?.cachedPickerId?.(value)
307
- ?? (value.startsWith(this.config.modelPrefix) ? value : `${this.config.modelPrefix}${value}`);
311
+ const modelPickerId = value.startsWith(this.config.modelPrefix) ? value : `${this.config.modelPrefix}${value}`;
308
312
  const claudeModelValue = resolveClaudeModel(this.config, modelPickerId);
309
- return claudeModelValue ? { modelPickerId, claudeModelValue } : undefined;
313
+ if (!claudeModelValue)
314
+ return undefined;
315
+ const lookup = this.cachedCatalogLookup(claudeModelValue);
316
+ return lookup ? this.catalogSelection(modelPickerId, claudeModelValue, lookup) : { modelPickerId, claudeModelValue };
310
317
  },
311
318
  }));
312
319
  const records = this.store.allThreadRecords();
@@ -418,11 +425,47 @@ export class ClaudeService {
418
425
  return threadSettings(this.withCatalogModel(this.requireRecord(threadId, false)));
419
426
  }
420
427
  withCatalogModel(record) {
421
- const modelPickerId = this.modelCatalog?.cachedPickerId?.(record.resolvedModel ?? record.claudeModelValue);
422
- if (!modelPickerId || modelPickerId === record.modelPickerId)
428
+ const lookup = this.cachedCatalogLookup(record.resolvedModel ?? record.claudeModelValue);
429
+ if (!lookup)
423
430
  return record;
424
- const claudeModelValue = resolveClaudeModel(this.config, modelPickerId);
425
- return claudeModelValue ? { ...record, modelPickerId, claudeModelValue } : record;
431
+ const selection = this.catalogSelection(record.modelPickerId, record.claudeModelValue, lookup);
432
+ return selection.modelPickerId === record.modelPickerId ? record : { ...record, ...selection };
433
+ }
434
+ /** Finds the catalog entry for a Claude model value, migrating retired ids onto the closest current model. */
435
+ catalogLookup(models, claudeModelValue) {
436
+ const catalog = this.modelCatalog;
437
+ const cached = catalog.cachedPickerId?.(claudeModelValue);
438
+ if (cached)
439
+ return { id: cached, model: models.find((candidate) => candidate.id === cached), reason: "exact" };
440
+ const prefix = this.config.modelPrefix;
441
+ const strip = (id) => id.slice(prefix.length);
442
+ const defaultId = catalog.defaultModelId?.();
443
+ const replacement = pickClaudeModelReplacement(claudeModelValue, models.map((candidate) => strip(candidate.id)), defaultId && strip(defaultId));
444
+ const model = replacement && models.find((candidate) => strip(candidate.id) === replacement.value);
445
+ return model ? { id: model.id, model, reason: replacement.reason } : undefined;
446
+ }
447
+ cachedCatalogLookup(claudeModelValue) {
448
+ return this.modelCatalog && this.catalogLookup(this.modelCatalog.cachedModels?.() ?? [], claudeModelValue);
449
+ }
450
+ catalogSelection(modelPickerId, claudeModelValue, lookup) {
451
+ const prefix = this.config.modelPrefix;
452
+ if (lookup.id === `${prefix}${claudeModelValue}` || lookup.id === claudeCatalogId(this.config, modelPickerId))
453
+ return { modelPickerId, claudeModelValue };
454
+ this.logger.warn("claude.model.migrated", { from: modelPickerId, to: lookup.id, reason: lookup.reason });
455
+ return { modelPickerId: lookup.id, claudeModelValue: lookup.id.slice(prefix.length) };
456
+ }
457
+ /** Persists a catalog migration for a stored thread so its runtime starts on a model the account still has. */
458
+ async migrateStoredModel(threadId) {
459
+ if (!this.modelCatalog)
460
+ return;
461
+ const record = this.requireRecord(threadId, false);
462
+ const models = await this.modelCatalog.list().catch(() => undefined);
463
+ const lookup = models && this.catalogLookup(models, record.claudeModelValue);
464
+ if (!lookup)
465
+ return;
466
+ const selection = this.catalogSelection(record.modelPickerId, record.claudeModelValue, lookup);
467
+ if (selection.modelPickerId !== record.modelPickerId)
468
+ await this.applySettings({ threadId, model: selection.modelPickerId });
426
469
  }
427
470
  sideSnapshot(sourceThreadId, targetThreadId, visibleForkedFromId) {
428
471
  const record = this.requireRecord(sourceThreadId, false);
@@ -508,10 +551,10 @@ export class ClaudeService {
508
551
  throw invalidParams(`Unknown Claude thread '${threadId}'.`);
509
552
  if (record.thread.parentThreadId) {
510
553
  record = this.withCatalogModel(record);
554
+ record = { ...record, thread: this.withNativeMetadata(record) };
511
555
  return {
512
556
  ...threadResponse(record, !resume.excludeTurns),
513
- turnsBackwardsCursor: record.thread.turns.length ? turnCursor(record.thread.turns.at(-1).id, true) : null,
514
- itemsBackwardsCursor: record.thread.turns.some((turn) => turn.items.length) ? "hyb-item:0" : null,
557
+ ...historyCursors(record.thread.turns),
515
558
  initialTurnsPage: resume.initialTurnsPage
516
559
  ? this.turnsPage({
517
560
  threadId,
@@ -531,13 +574,16 @@ export class ClaudeService {
531
574
  : {}),
532
575
  });
533
576
  }
577
+ await this.migrateStoredModel(threadId);
534
578
  await (await this.sessions.getOrCreate(threadId)).materializeRuntime();
535
579
  record = await this.sessions.submit(threadId, { type: "readThread", includeTurns: true });
536
580
  record = this.withCatalogModel(record);
581
+ record = { ...record, thread: this.withNativeMetadata(record) };
582
+ if (this.store.listQueuedSubmissions(threadId).length)
583
+ this.scheduleQueueDrain(threadId);
537
584
  return {
538
585
  ...threadResponse(record, !resume.excludeTurns),
539
- turnsBackwardsCursor: record.thread.turns.length ? turnCursor(record.thread.turns.at(-1).id, true) : null,
540
- itemsBackwardsCursor: record.thread.turns.some((turn) => turn.items.length) ? "hyb-item:0" : null,
586
+ ...historyCursors(record.thread.turns),
541
587
  initialTurnsPage: resume.initialTurnsPage
542
588
  ? this.turnsPage({
543
589
  threadId,
@@ -588,6 +634,10 @@ export class ClaudeService {
588
634
  }
589
635
  async prepareTurn(params, review) {
590
636
  this.requireIndependentThread(params.threadId, "start a turn in");
637
+ if (params.toolOutput)
638
+ throw invalidParams("Claude threads do not support toolOutput.");
639
+ if (params.serviceTierForTurn != null)
640
+ this.logger.warn("claude.turn.service-tier-for-turn.ignored", { threadId: params.threadId, serviceTierForTurn: params.serviceTierForTurn });
591
641
  const availability = await this.availabilityProbe();
592
642
  if (availability.state !== "ready")
593
643
  throw invalidParams(providerUnavailableMessage(availability));
@@ -614,7 +664,8 @@ export class ClaudeService {
614
664
  let announcement;
615
665
  const startAndWait = () => announcement ? announcement.then(startRuntime) : startRuntime();
616
666
  return {
617
- response: { turn: prepared.turn },
667
+ response: { turn: startedTurn(prepared.turn) },
668
+ turn: prepared.turn,
618
669
  announce: () => announcement ??= this.sessions.submit(params.threadId, { type: "announceTurn", turnId: prepared.turn.id }),
619
670
  start: () => {
620
671
  void startAndWait().catch((error) => this.logger.error("claude.turn.start-failed", { threadId: params.threadId, error: String(error) }));
@@ -850,7 +901,10 @@ export class ClaudeService {
850
901
  }
851
902
  async shellCommand(params) {
852
903
  this.requireIndependentThread(params.threadId, "run a shell command in");
853
- await this.sessions.submit(params.threadId, { type: "runShell", command: params.command });
904
+ const timeoutMs = params.timeoutMs ?? 3_600_000;
905
+ if (timeoutMs < 0)
906
+ throw invalidParams(`thread/shellCommand timeoutMs must be non-negative, got ${timeoutMs}`);
907
+ await this.sessions.submit(params.threadId, { type: "runShell", command: params.command, timeoutMs });
854
908
  return {};
855
909
  }
856
910
  async prepareReview(params) {
@@ -873,6 +927,8 @@ export class ClaudeService {
873
927
  let reviewThreadId = params.threadId;
874
928
  let forkedThread;
875
929
  if (params.delivery === "detached") {
930
+ if (this.requireRecord(params.threadId, false).thread.historyMode === "paginated")
931
+ throw invalidRequest("paginated threads do not support detached review");
876
932
  const fork = await this.forkThread({ threadId: params.threadId, excludeTurns: false });
877
933
  reviewThreadId = fork.thread.id;
878
934
  forkedThread = fork.thread;
@@ -882,7 +938,7 @@ export class ClaudeService {
882
938
  threadId: reviewThreadId,
883
939
  input: [{ type: "text", text: prompt, text_elements: [] }],
884
940
  }, { label: review, display: review });
885
- const userItem = prepared.response.turn.items.find((item) => item.type === "userMessage");
941
+ const userItem = prepared.turn.items.find((item) => item.type === "userMessage");
886
942
  return {
887
943
  response: {
888
944
  turn: {
@@ -941,6 +997,15 @@ export class ClaudeService {
941
997
  this.nativeMetadataRead = read;
942
998
  return read;
943
999
  }
1000
+ async setGeneratedThreadName(params, userPrompt) {
1001
+ const record = this.requireRecord(params.threadId, false);
1002
+ if (record.thread.parentThreadId || this.nativeMetadata.get(record.claudeSessionId)?.customTitle)
1003
+ return;
1004
+ await this.sessions.submit(params.threadId, {
1005
+ type: "threadAdmin",
1006
+ command: { kind: "generatedName", name: params.name, userPrompt },
1007
+ });
1008
+ }
944
1009
  async setThreadName(params) {
945
1010
  const record = this.requireRecord(params.threadId, false);
946
1011
  if (record.thread.parentThreadId) {
@@ -967,9 +1032,20 @@ export class ClaudeService {
967
1032
  }
968
1033
  updateThreadMetadata(params) {
969
1034
  this.requireIndependentThread(params.threadId, "update metadata for");
1035
+ if (params.projectId !== undefined && params.projectId !== null && params.projectId !== "") {
1036
+ throw invalidParams("Projects are not supported for Claude threads.");
1037
+ }
970
1038
  return this.sessions.submit(params.threadId, {
971
1039
  type: "threadAdmin",
972
- command: { kind: "metadata", gitInfo: params.gitInfo, isPinned: params.isPinned },
1040
+ command: { kind: "metadata", gitInfo: params.gitInfo },
1041
+ });
1042
+ }
1043
+ /** Section registry stays stock-owned; CCodex records only the membership. */
1044
+ setThreadSection(threadId, section) {
1045
+ this.requireIndependentThread(threadId, "move into a section");
1046
+ return this.sessions.submit(threadId, {
1047
+ type: "threadAdmin",
1048
+ command: { kind: "metadata", gitInfo: undefined, section },
973
1049
  });
974
1050
  }
975
1051
  async archiveThread(threadId) {
@@ -1073,61 +1149,21 @@ export class ClaudeService {
1073
1149
  }
1074
1150
  listItems(params) {
1075
1151
  this.assertThreadAvailable(params.threadId);
1076
- const items = this.store.listTurns(params.threadId)
1077
- .flatMap((turn) => params.turnId && turn.id !== params.turnId
1078
- ? []
1079
- : turn.items.map((item) => ({ turnId: turn.id, item })));
1080
- const ordered = params.sortDirection === "desc" ? [...items].reverse() : items;
1081
- if (params.cursor && !params.cursor.startsWith("hyb-item:"))
1082
- throw invalidParams("Invalid Claude item cursor.");
1083
- const offset = params.cursor?.startsWith("hyb-item:") ? Number(params.cursor.slice("hyb-item:".length)) : 0;
1084
- if (!Number.isInteger(offset) || offset < 0)
1085
- throw invalidParams("Invalid Claude item cursor.");
1086
- const limit = Math.max(1, Math.min(params.limit ?? 50, 100));
1087
- const data = ordered.slice(offset, offset + limit);
1088
- return {
1089
- data,
1090
- nextCursor: offset + data.length < ordered.length ? `hyb-item:${offset + data.length}` : null,
1091
- backwardsCursor: data.length > 0 ? `hyb-item:${Math.max(0, offset - limit)}` : null,
1092
- };
1152
+ return paginateItems(this.store.listTurns(params.threadId), params, ["hyb-item:"]);
1093
1153
  }
1094
1154
  searchOccurrences(params) {
1095
1155
  this.assertThreadAvailable(params.threadId);
1156
+ return searchTurnOccurrences(params.threadId, this.store.listTurns(params.threadId), params);
1157
+ }
1158
+ /** `thread/search` over durable Claude threads: one result per thread with the first matching snippet. */
1159
+ searchThreads(params) {
1096
1160
  const searchTerm = params.searchTerm.trim();
1097
- if (!searchTerm)
1098
- throw invalidParams("thread/searchOccurrences requires a non-empty searchTerm.");
1099
- if (params.cursor && !params.cursor.startsWith("hyb-search:"))
1100
- throw invalidParams("Invalid Claude search cursor.");
1101
- const offset = params.cursor ? Number(params.cursor.slice("hyb-search:".length)) : 0;
1102
- if (!Number.isInteger(offset) || offset < 0)
1103
- throw invalidParams("Invalid Claude search cursor.");
1104
- const turns = this.store.listTurns(params.threadId);
1105
- const needle = searchTerm.toLocaleLowerCase();
1106
- const occurrences = turns.flatMap((turn) => turn.items.flatMap((item) => {
1107
- const text = item.type === "userMessage"
1108
- ? item.content.flatMap((part) => part.type === "text" ? [part.text] : []).join("\n")
1109
- : item.type === "agentMessage" && item.phase !== "commentary" ? item.text : undefined;
1110
- if (text === undefined)
1161
+ return this.listThreads({ archived: params.archived ?? false }).flatMap((thread) => {
1162
+ if (thread.ephemeral)
1111
1163
  return [];
1112
- const haystack = text.toLocaleLowerCase();
1113
- const matches = [];
1114
- for (let start = haystack.indexOf(needle); start >= 0; start = haystack.indexOf(needle, start + needle.length)) {
1115
- matches.push({
1116
- turnId: turn.id,
1117
- itemId: item.id,
1118
- snippet: text,
1119
- snippetMatchRange: { start, end: start + needle.length },
1120
- turnCursor: turnCursor(turn.id, true),
1121
- });
1122
- }
1123
- return matches;
1124
- }));
1125
- const limit = Math.max(1, Math.min(params.limit ?? 50, 100));
1126
- const data = occurrences.slice(offset, offset + limit);
1127
- return {
1128
- data,
1129
- nextCursor: offset + data.length < occurrences.length ? `hyb-search:${offset + data.length}` : null,
1130
- };
1164
+ const snippet = threadSearchSnippet(this.store.listTurns(thread.id), searchTerm);
1165
+ return snippet === undefined ? [] : [{ thread: { ...thread, turns: [] }, snippet }];
1166
+ });
1131
1167
  }
1132
1168
  async forkThread(params, visibleForkedFromId = params.threadId) {
1133
1169
  if (params.path)
@@ -1142,6 +1178,8 @@ export class ClaudeService {
1142
1178
  : undefined;
1143
1179
  const source = await this.sessions.submit(params.threadId, { type: "snapshotBranch" });
1144
1180
  const sourceRecord = source.record;
1181
+ if (sourceRecord.thread.historyMode === "paginated" && params.ephemeral && !params.excludeTurns)
1182
+ throw invalidRequest("ephemeral paginated thread/fork requires `excludeTurns: true`");
1145
1183
  const sidePromotion = Boolean((this.config.features?.sideChatPromotion ?? true)
1146
1184
  && sourceRecord.thread.ephemeral
1147
1185
  && sourceRecord.thread.threadSource === "user"
@@ -1149,9 +1187,8 @@ export class ClaudeService {
1149
1187
  if (sourceRecord.thread.ephemeral && !sidePromotion) {
1150
1188
  throw invalidParams("Forking this ephemeral Claude source thread is not supported.");
1151
1189
  }
1152
- const modelPickerId = params.model ?? sourceRecord.modelPickerId;
1153
- const claudeModelValue = resolveClaudeModel(this.config, modelPickerId);
1154
- if (!claudeModelValue)
1190
+ const requestedModel = params.model ?? sourceRecord.modelPickerId;
1191
+ if (!resolveClaudeModel(this.config, requestedModel))
1155
1192
  throw invalidParams("Cannot fork a Claude thread to a Codex model.");
1156
1193
  const activeSideFork = Boolean(params.ephemeral === true && params.excludeTurns === true
1157
1194
  && params.threadSource === "user" && !params.lastTurnId && !params.beforeTurnId);
@@ -1195,8 +1232,10 @@ export class ClaudeService {
1195
1232
  const sourceBoundaries = source.boundaries.filter((entry) => stableSelectedIds.has(entry.turnId));
1196
1233
  const revisionTurns = sourceTurns.filter((turn) => stableSelectedIds.has(turn.id));
1197
1234
  const revision = branchRevision(sourceRecord, sourceBoundaries, revisionTurns);
1198
- const serviceTier = normalizeClaudeServiceTier(this.config, modelPickerId, params.serviceTier === undefined ? sourceRecord.serviceTier : params.serviceTier);
1199
- await this.validateModelSettings(modelPickerId, sourceRecord.reasoningEffort, serviceTier);
1235
+ const requestedServiceTier = normalizeClaudeServiceTier(this.config, requestedModel, params.serviceTier === undefined ? sourceRecord.serviceTier : params.serviceTier);
1236
+ const { modelPickerId, claudeModelValue, reasoningEffort, serviceTier } = await this.resolveModelSettings(requestedModel, sourceRecord.reasoningEffort, requestedServiceTier);
1237
+ if (serviceTier !== requestedServiceTier)
1238
+ throw invalidParams(`Claude model '${requestedModel}' does not support the fast service tier.`);
1200
1239
  const boundary = selectedBoundary?.messageUuid ?? sourceBoundaries.at(-1)?.messageUuid;
1201
1240
  const branch = boundary
1202
1241
  ? await this.transcripts.forkWithProvenance(sourceRecord.claudeSessionId, boundary, sourceRecord.thread.cwd, sourceBoundaries.map((entry) => entry.messageUuid), boundaryCorrelations(this.store, sourceRecord, sourceBoundaries))
@@ -1220,9 +1259,11 @@ export class ClaudeService {
1220
1259
  });
1221
1260
  const threadId = uuidv7();
1222
1261
  const thread = {
1223
- ...sourceRecord.thread, id: threadId, ephemeral: params.ephemeral ?? false, isPinned: false,
1262
+ ...sourceRecord.thread, id: threadId, ephemeral: params.ephemeral ?? false,
1263
+ section: null, sectionEnteredAt: null, projectId: null,
1224
1264
  sessionId: threadId, forkedFromId: visibleForkedFromId,
1225
- cwd, modelProvider: "claude", createdAt, updatedAt: createdAt, recencyAt: createdAt,
1265
+ cwd, modelProvider: "claude", model: modelPickerId, reasoningEffort,
1266
+ createdAt, updatedAt: createdAt, recencyAt: createdAt,
1226
1267
  status: params.ephemeral ? { type: "idle" } : { type: "notLoaded" },
1227
1268
  canAcceptDirectInput: true,
1228
1269
  name: params.ephemeral
@@ -1233,7 +1274,7 @@ export class ClaudeService {
1233
1274
  const copiedTurns = sourceTurns.map((turn) => forkProjection(turn, thread.id));
1234
1275
  const record = {
1235
1276
  ...sourceRecord, thread, runtimeWorkspaceRoots,
1236
- claudeSessionId: branch.sessionId, modelPickerId, claudeModelValue, serviceTier,
1277
+ claudeSessionId: branch.sessionId, modelPickerId, claudeModelValue, serviceTier, reasoningEffort,
1237
1278
  approvalPolicy: params.approvalPolicy ?? sourceRecord.approvalPolicy,
1238
1279
  approvalsReviewer: approvalsReviewer(params.approvalsReviewer, sourceRecord.approvalsReviewer),
1239
1280
  sandboxPolicy: params.permissions
@@ -1281,21 +1322,43 @@ export class ClaudeService {
1281
1322
  return threadResponse(responseRecord, !params.excludeTurns);
1282
1323
  }
1283
1324
  async rollbackThread(params) {
1284
- this.requireIndependentThread(params.threadId, "roll back");
1285
- const source = await this.sessions.submit(params.threadId, { type: "snapshotBranch" });
1286
- const sourceRecord = source.record;
1287
- if (sourceRecord.thread.ephemeral)
1288
- throw invalidParams("Rolling back an ephemeral Claude thread is not supported.");
1325
+ const source = await this.truncationSource(params.threadId, "roll back");
1326
+ if (source.record.thread.historyMode === "paginated")
1327
+ throw invalidRequest("paginated threads do not support thread/rollback");
1289
1328
  if (!Number.isInteger(params.numTurns) || params.numTurns < 1)
1290
1329
  throw invalidParams("numTurns must be at least 1.");
1291
- if (params.numTurns > sourceRecord.thread.turns.length)
1330
+ if (params.numTurns > source.record.thread.turns.length)
1292
1331
  throw invalidParams("Cannot remove more turns than the Claude thread contains.");
1293
- const sourceSession = await this.sessions.getOrCreate(params.threadId);
1294
- if ((await sourceSession.runtimeInspection())?.quiescent === false)
1295
- throw invalidParams("Cannot roll back a Claude thread with an active turn.");
1296
- const keepCount = sourceRecord.thread.turns.length - params.numTurns;
1297
- const retained = sourceRecord.thread.turns.slice(0, keepCount);
1298
- const retainedIds = new Set(retained.map((turn) => turn.id));
1332
+ const committed = await this.truncateThread(source, source.record.thread.turns.length - params.numTurns);
1333
+ return { thread: committed.thread };
1334
+ }
1335
+ /** `thread/revert`: drops `beforeTurnId` and every later turn; the App hydrates retained history via the cursors. */
1336
+ async revertThread(params) {
1337
+ const source = await this.truncationSource(params.threadId, "revert");
1338
+ const keepCount = source.record.thread.turns.findIndex((turn) => turn.id === params.beforeTurnId);
1339
+ if (keepCount === -1)
1340
+ throw invalidParams(`Unknown Claude turn '${params.beforeTurnId}'.`);
1341
+ const retained = (await this.truncateThread(source, keepCount)).thread;
1342
+ return {
1343
+ thread: { ...retained, turns: [] },
1344
+ ...historyCursors(retained.turns),
1345
+ };
1346
+ }
1347
+ async truncationSource(threadId, verb) {
1348
+ this.requireIndependentThread(threadId, verb);
1349
+ const snapshot = await this.sessions.submit(threadId, { type: "snapshotBranch" });
1350
+ if (snapshot.record.thread.ephemeral)
1351
+ throw invalidParams(`Cannot ${verb} an ephemeral Claude thread.`);
1352
+ const session = await this.sessions.getOrCreate(threadId);
1353
+ if ((await session.runtimeInspection())?.quiescent === false)
1354
+ throw invalidParams(`Cannot ${verb} a Claude thread with an active turn.`);
1355
+ return { ...snapshot, session };
1356
+ }
1357
+ /** Keeps the first `keepCount` turns by forking the transcript at the last retained provider boundary. */
1358
+ async truncateThread(source, keepCount) {
1359
+ const sourceRecord = source.record;
1360
+ const threadId = sourceRecord.thread.id;
1361
+ const retainedIds = new Set(sourceRecord.thread.turns.slice(0, keepCount).map((turn) => turn.id));
1299
1362
  const sourceBoundaries = source.boundaries.filter((entry) => retainedIds.has(entry.turnId));
1300
1363
  const boundary = sourceBoundaries.at(-1)?.messageUuid;
1301
1364
  const branch = boundary
@@ -1303,7 +1366,7 @@ export class ClaudeService {
1303
1366
  : { sessionId: uuidv7(), uuidMap: new Map() };
1304
1367
  let committed;
1305
1368
  try {
1306
- committed = await this.sessions.submit(params.threadId, {
1369
+ committed = await this.sessions.submit(threadId, {
1307
1370
  type: "commitRollback", expectedRevision: source.revision, replacementSessionId: branch.sessionId,
1308
1371
  keepCount, sourceBoundaries, uuidMap: [...branch.uuidMap],
1309
1372
  });
@@ -1312,18 +1375,118 @@ export class ClaudeService {
1312
1375
  await this.transcripts.delete(branch.sessionId, sourceRecord.thread.cwd).catch(() => undefined);
1313
1376
  throw error;
1314
1377
  }
1315
- if (sourceSession.isLoaded) {
1316
- await sourceSession.retireRuntimeSilently().catch((error) => {
1317
- this.logger.warn("claude.rollback.old-runtime-retire-failed", { threadId: params.threadId, error: String(error) });
1378
+ if (source.session.isLoaded) {
1379
+ await source.session.retireRuntimeSilently().catch((error) => {
1380
+ this.logger.warn("claude.rollback.old-runtime-retire-failed", { threadId, error: String(error) });
1318
1381
  });
1319
1382
  }
1320
- await this.transcripts.delete(sourceRecord.claudeSessionId, sourceRecord.thread.cwd).catch((error) => this.logger.warn("claude.rollback.old-session-delete-failed", { threadId: params.threadId, error: String(error) }));
1321
- return { thread: committed.thread };
1383
+ await this.transcripts.delete(sourceRecord.claudeSessionId, sourceRecord.thread.cwd).catch((error) => this.logger.warn("claude.rollback.old-session-delete-failed", { threadId, error: String(error) }));
1384
+ return committed;
1322
1385
  }
1323
1386
  prepareGoalSet(params) {
1324
1387
  this.requireIndependentThread(params.threadId, "set a goal on");
1325
1388
  return this.sessions.submit(params.threadId, { type: "goal", command: { kind: "prepareSet", params } }).then((mutation) => this.goalHandle(params.threadId, mutation));
1326
1389
  }
1390
+ async addQueuedSubmission(params) {
1391
+ this.requireIndependentThread(params.threadId, "queue a submission in");
1392
+ const queuedSubmission = await this.sessions.submit(params.threadId, {
1393
+ type: "queue",
1394
+ command: { kind: "add", input: params.input, clientUserMessageId: params.clientUserMessageId },
1395
+ });
1396
+ return { response: { queuedSubmission }, after: () => this.drainQueue(params.threadId) };
1397
+ }
1398
+ /** Offset pagination over the durable per-thread queue; the cursor is the base-10 offset, as in stock. */
1399
+ listQueue(params) {
1400
+ this.requireRecord(params.threadId, false);
1401
+ const cursor = params.cursor ?? null;
1402
+ if (cursor !== null && !/^\d+$/u.test(cursor))
1403
+ throw invalidRequest(`invalid queue pagination cursor: ${cursor}`);
1404
+ const offset = cursor === null ? 0 : Number(cursor);
1405
+ const limit = Math.min(Math.max(params.limit ?? 25, 1), 100);
1406
+ const queue = this.store.listQueuedSubmissions(params.threadId);
1407
+ return {
1408
+ data: queue.slice(offset, offset + limit),
1409
+ nextCursor: offset + limit < queue.length ? String(offset + limit) : null,
1410
+ };
1411
+ }
1412
+ async updateQueuedSubmission(params) {
1413
+ this.requireIndependentThread(params.threadId, "update a queued submission in");
1414
+ const queuedSubmission = await this.sessions.submit(params.threadId, {
1415
+ type: "queue",
1416
+ command: { kind: "update", queuedSubmissionId: params.queuedSubmissionId, input: params.input },
1417
+ });
1418
+ return { queuedSubmission };
1419
+ }
1420
+ async deleteQueuedSubmission(params) {
1421
+ this.requireIndependentThread(params.threadId, "delete a queued submission from");
1422
+ const deleted = await this.sessions.submit(params.threadId, {
1423
+ type: "queue", command: { kind: "delete", queuedSubmissionId: params.queuedSubmissionId },
1424
+ });
1425
+ return { deleted };
1426
+ }
1427
+ async reorderQueue(params) {
1428
+ this.requireIndependentThread(params.threadId, "reorder the queue of");
1429
+ await this.sessions.submit(params.threadId, {
1430
+ type: "queue", command: { kind: "reorder", queuedSubmissionIds: params.queuedSubmissionIds },
1431
+ });
1432
+ return {};
1433
+ }
1434
+ async prepareQueueStart(params) {
1435
+ this.requireIndependentThread(params.threadId, "start a queued submission in");
1436
+ const entry = await this.sessions.submit(params.threadId, {
1437
+ type: "queue",
1438
+ command: {
1439
+ kind: "take",
1440
+ manual: true,
1441
+ ...(params.queuedSubmissionId == null ? {} : { queuedSubmissionId: params.queuedSubmissionId }),
1442
+ },
1443
+ });
1444
+ return this.startQueuedSubmission(params.threadId, entry);
1445
+ }
1446
+ async startQueuedSubmission(threadId, entry) {
1447
+ try {
1448
+ return await this.prepareTurn({ threadId, input: entry.input, clientUserMessageId: entry.clientUserMessageId });
1449
+ }
1450
+ catch (error) {
1451
+ await this.sessions.submit(threadId, { type: "queue", command: { kind: "restore", entry } });
1452
+ throw error;
1453
+ }
1454
+ }
1455
+ /** Starts the head of the queue when the thread is idle and its last turn was not interrupted. */
1456
+ async drainQueue(threadId) {
1457
+ if (this.closing || this.store.listQueuedSubmissions(threadId).length === 0)
1458
+ return;
1459
+ const entry = await this.sessions.submit(threadId, {
1460
+ type: "queue", command: { kind: "take", manual: false },
1461
+ });
1462
+ if (!entry)
1463
+ return;
1464
+ let prepared;
1465
+ try {
1466
+ prepared = await this.startQueuedSubmission(threadId, entry);
1467
+ }
1468
+ catch (error) {
1469
+ this.logger[error instanceof ActiveClaudeTurnError ? "info" : "warn"]("claude.queue.drain-skipped", {
1470
+ threadId, queuedSubmissionId: entry.id, error: String(error),
1471
+ });
1472
+ return;
1473
+ }
1474
+ await prepared.announce();
1475
+ prepared.start();
1476
+ }
1477
+ scheduleQueueDrain(threadId) {
1478
+ queueMicrotask(() => {
1479
+ void this.drainQueue(threadId).catch((error) => {
1480
+ this.logger.warn("claude.queue.drain-failed", { threadId, error: String(error) });
1481
+ });
1482
+ });
1483
+ }
1484
+ onSessionLifecycle(threadId, update) {
1485
+ if (update.completed && update.completed.turn.status !== "interrupted")
1486
+ this.queueDrainPending.add(threadId);
1487
+ if (update.quiescent && this.queueDrainPending.delete(threadId))
1488
+ this.scheduleQueueDrain(threadId);
1489
+ }
1327
1490
  async getGoal(threadId) {
1328
1491
  if (this.requireRecord(threadId, false).thread.parentThreadId)
1329
1492
  return { goal: null };
@@ -1637,7 +1800,9 @@ export class ClaudeService {
1637
1800
  if (!native)
1638
1801
  return {
1639
1802
  ...record.thread,
1640
- isPinned: record.thread.isPinned ?? false,
1803
+ section: record.thread.section ?? null,
1804
+ sectionEnteredAt: record.thread.sectionEnteredAt ?? null,
1805
+ projectId: record.thread.projectId ?? null,
1641
1806
  canAcceptDirectInput: record.thread.parentThreadId ? false : true,
1642
1807
  };
1643
1808
  const createdAt = native.createdAt === undefined
@@ -1646,7 +1811,9 @@ export class ClaudeService {
1646
1811
  const updatedAt = Math.floor(native.lastModified / 1_000);
1647
1812
  return {
1648
1813
  ...record.thread,
1649
- isPinned: record.thread.isPinned ?? false,
1814
+ section: record.thread.section ?? null,
1815
+ sectionEnteredAt: record.thread.sectionEnteredAt ?? null,
1816
+ projectId: record.thread.projectId ?? null,
1650
1817
  canAcceptDirectInput: record.thread.parentThreadId ? false : true,
1651
1818
  name: record.thread.name || native.customTitle || native.summary,
1652
1819
  preview: native.firstPrompt ?? record.thread.preview,
@@ -1704,17 +1871,15 @@ export class ClaudeService {
1704
1871
  return undefined;
1705
1872
  }
1706
1873
  async newThreadRecord(params, settings) {
1707
- const modelPickerId = params.model;
1708
- const claudeModelValue = modelPickerId && resolveClaudeModel(this.config, modelPickerId);
1709
- if (!modelPickerId || !claudeModelValue)
1874
+ const requestedModel = params.model;
1875
+ if (!requestedModel || !resolveClaudeModel(this.config, requestedModel))
1710
1876
  throw invalidParams("Claude thread requires a configured Claude model or alias.");
1711
1877
  if (params.permissions && params.sandbox)
1712
1878
  throw invalidParams("Claude thread start cannot combine permissions with sandbox.");
1713
- const requestedServiceTier = normalizeClaudeServiceTier(this.config, modelPickerId, params.serviceTier);
1879
+ const requestedServiceTier = normalizeClaudeServiceTier(this.config, requestedModel, params.serviceTier);
1714
1880
  if (requestedServiceTier !== null && requestedServiceTier !== "default" && requestedServiceTier !== "fast")
1715
1881
  throw invalidParams(`Unsupported Claude service tier '${requestedServiceTier}'.`);
1716
- const reasoningEffort = settings?.effort ?? null;
1717
- const serviceTier = await this.validatedServiceTier(modelPickerId, reasoningEffort, requestedServiceTier);
1882
+ const { modelPickerId, claudeModelValue, reasoningEffort, serviceTier } = await this.resolveModelSettings(requestedModel, settings?.effort ?? null, requestedServiceTier);
1718
1883
  const createdAt = nowSeconds();
1719
1884
  const workspace = workspaceSelection(params);
1720
1885
  const { cwd, runtimeWorkspaceRoots } = workspace;
@@ -1727,9 +1892,11 @@ export class ClaudeService {
1727
1892
  parentThreadId: null,
1728
1893
  preview: "",
1729
1894
  ephemeral: params.ephemeral ?? false,
1730
- isPinned: false,
1731
- historyMode: params.historyMode ?? "legacy",
1732
- modelProvider: "claude",
1895
+ section: null,
1896
+ sectionEnteredAt: null,
1897
+ projectId: null,
1898
+ historyMode: params.historyMode ?? (params.ephemeral ? "legacy" : "paginated"),
1899
+ modelProvider: "claude", model: modelPickerId, reasoningEffort,
1733
1900
  createdAt,
1734
1901
  updatedAt: createdAt,
1735
1902
  recencyAt: createdAt,
@@ -1803,11 +1970,10 @@ export class ClaudeService {
1803
1970
  const session = await this.sessions.getOrCreate(params.threadId);
1804
1971
  for (;;) {
1805
1972
  const before = await this.sessions.submit(params.threadId, { type: "readThread", includeTurns: false });
1806
- const modelPickerId = params.model ?? before.modelPickerId;
1807
- const claudeModelValue = resolveClaudeModel(this.config, modelPickerId);
1808
- if (!claudeModelValue)
1973
+ const requestedModel = params.model ?? before.modelPickerId;
1974
+ if (!resolveClaudeModel(this.config, requestedModel))
1809
1975
  throw invalidParams("Cannot switch a Claude thread to a Codex model.");
1810
- const requestedServiceTier = normalizeClaudeServiceTier(this.config, modelPickerId, params.serviceTier === undefined ? before.serviceTier : params.serviceTier);
1976
+ const requestedServiceTier = normalizeClaudeServiceTier(this.config, requestedModel, params.serviceTier === undefined ? before.serviceTier : params.serviceTier);
1811
1977
  if (requestedServiceTier !== null && requestedServiceTier !== "default" && requestedServiceTier !== "fast")
1812
1978
  throw invalidParams(`Unsupported Claude service tier '${requestedServiceTier}'.`);
1813
1979
  const { cwd, runtimeWorkspaceRoots } = workspaceSelection(params, {
@@ -1817,8 +1983,7 @@ export class ClaudeService {
1817
1983
  const workspaceChanged = cwd !== before.thread.cwd
1818
1984
  || runtimeWorkspaceRoots.length !== storedWorkspaceRoots(before).length
1819
1985
  || runtimeWorkspaceRoots.some((root, index) => root !== storedWorkspaceRoots(before)[index]);
1820
- const reasoningEffort = params.effort === undefined ? before.reasoningEffort : params.effort;
1821
- const serviceTier = await this.validatedServiceTier(modelPickerId, reasoningEffort, requestedServiceTier);
1986
+ const { modelPickerId, claudeModelValue, reasoningEffort, serviceTier } = await this.resolveModelSettings(requestedModel, params.effort === undefined ? before.reasoningEffort : params.effort, requestedServiceTier, params.effort !== undefined);
1822
1987
  syncCanonicalSettings = requestedServiceTier === "fast" && serviceTier !== "fast";
1823
1988
  const collaborationMode = params.collaborationMode === undefined
1824
1989
  ? before.collaborationMode
@@ -1873,24 +2038,30 @@ export class ClaudeService {
1873
2038
  }
1874
2039
  }
1875
2040
  }
1876
- async validatedServiceTier(modelId, effort, serviceTier) {
2041
+ /**
2042
+ * Resolves requested model settings against the account catalog. A model id the catalog no longer
2043
+ * lists is migrated onto its closest current entry instead of failing the request, and an effort the
2044
+ * target model does not support is coerced to that model's default unless it was requested explicitly.
2045
+ */
2046
+ async resolveModelSettings(modelPickerId, effort, serviceTier, explicitEffort = false) {
2047
+ const claudeModelValue = resolveClaudeModel(this.config, modelPickerId);
1877
2048
  if (!this.modelCatalog)
1878
- return serviceTier;
1879
- const catalogId = claudeCatalogId(this.config, modelId);
1880
- const model = (await this.modelCatalog.list()).find((candidate) => candidate.id === catalogId);
1881
- if (!model)
1882
- throw invalidParams(`Claude model '${modelId}' is not present in the current account catalog.`);
1883
- if (effort && !model.supportedReasoningEfforts.some((level) => level.reasoningEffort === effort)) {
1884
- throw invalidParams(`Claude model '${modelId}' does not support effort '${effort}'.`);
1885
- }
1886
- return serviceTier === "fast" && !model.serviceTiers.some((tier) => tier.id === "fast")
1887
- ? null
1888
- : serviceTier;
1889
- }
1890
- async validateModelSettings(modelId, effort, serviceTier) {
1891
- if (await this.validatedServiceTier(modelId, effort, serviceTier) !== serviceTier) {
1892
- throw invalidParams(`Claude model '${modelId}' does not support the fast service tier.`);
1893
- }
2049
+ return { modelPickerId, claudeModelValue, reasoningEffort: effort, serviceTier };
2050
+ const lookup = this.catalogLookup(await this.modelCatalog.list(), claudeModelValue);
2051
+ const model = lookup?.model;
2052
+ if (!lookup || !model)
2053
+ throw invalidParams(`Claude model '${modelPickerId}' is not present in the current account catalog.`);
2054
+ const selection = this.catalogSelection(modelPickerId, claudeModelValue, lookup);
2055
+ const effortSupported = !effort || model.supportedReasoningEfforts.some((level) => level.reasoningEffort === effort);
2056
+ if (!effortSupported && explicitEffort && selection.modelPickerId === modelPickerId)
2057
+ throw invalidParams(`Claude model '${modelPickerId}' does not support effort '${effort}'.`);
2058
+ if (!effortSupported)
2059
+ this.logger.warn("claude.effort.coerced", { model: model.id, from: effort, to: model.defaultReasoningEffort });
2060
+ return {
2061
+ ...selection,
2062
+ reasoningEffort: effortSupported ? effort : model.supportedReasoningEfforts.length ? model.defaultReasoningEffort : null,
2063
+ serviceTier: serviceTier === "fast" && !model.serviceTiers.some((tier) => tier.id === "fast") ? null : serviceTier,
2064
+ };
1894
2065
  }
1895
2066
  async readStandaloneRateLimitStatus() {
1896
2067
  const abort = new AbortController();