@gkorepanov/ccodex 0.4.20 → 0.4.24

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 (264) 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/rateLimits.d.ts +2 -1
  8. package/dist/claude/rateLimits.js +12 -16
  9. package/dist/claude/rateLimits.js.map +1 -1
  10. package/dist/claude/service.d.ts +41 -1
  11. package/dist/claude/service.js +166 -69
  12. package/dist/claude/service.js.map +1 -1
  13. package/dist/claude/session/commands.d.ts +36 -0
  14. package/dist/claude/session/goalState.d.ts +5 -0
  15. package/dist/claude/session/goalState.js +22 -0
  16. package/dist/claude/session/goalState.js.map +1 -1
  17. package/dist/claude/session/providerRuntimeFactory.js +15 -7
  18. package/dist/claude/session/providerRuntimeFactory.js.map +1 -1
  19. package/dist/claude/session/repository.d.ts +3 -0
  20. package/dist/claude/session/repository.js +2 -0
  21. package/dist/claude/session/repository.js.map +1 -1
  22. package/dist/claude/session/runtime.d.ts +10 -0
  23. package/dist/claude/session/runtime.js +45 -3
  24. package/dist/claude/session/runtime.js.map +1 -1
  25. package/dist/claude/session/scopeState.js +1 -0
  26. package/dist/claude/session/scopeState.js.map +1 -1
  27. package/dist/claude/session/session.d.ts +1 -0
  28. package/dist/claude/session/session.js +162 -55
  29. package/dist/claude/session/session.js.map +1 -1
  30. package/dist/claude/skillCatalog.js +1 -0
  31. package/dist/claude/skillCatalog.js.map +1 -1
  32. package/dist/claude/statusCommand.js +1 -2
  33. package/dist/claude/statusCommand.js.map +1 -1
  34. package/dist/codex/generated/AuthMode.d.ts +1 -1
  35. package/dist/codex/generated/ClientRequest.d.ts +25 -0
  36. package/dist/codex/generated/InternalSessionSource.d.ts +1 -1
  37. package/dist/codex/generated/ResponseItem.d.ts +3 -1
  38. package/dist/codex/generated/ResponseItemRuntimeSchema.js +2 -2
  39. package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -1
  40. package/dist/codex/generated/ServerNotification.d.ts +23 -0
  41. package/dist/codex/generated/ServerNotificationEnvelope.d.ts +23 -0
  42. package/dist/codex/generated/v2/AllowDenyRequirement.d.ts +1 -0
  43. package/dist/codex/generated/v2/AllowDenyRequirement.js +3 -0
  44. package/dist/codex/generated/v2/AllowDenyRequirement.js.map +1 -0
  45. package/dist/codex/generated/v2/AppLinksConfig.d.ts +11 -0
  46. package/dist/codex/generated/v2/AppLinksConfig.js +3 -0
  47. package/dist/codex/generated/v2/AppLinksConfig.js.map +1 -0
  48. package/dist/codex/generated/v2/AppsConfig.d.ts +5 -0
  49. package/dist/codex/generated/v2/AsyncUserInputQuestion.d.ts +4 -0
  50. package/dist/codex/generated/v2/AsyncUserInputQuestion.js +3 -0
  51. package/dist/codex/generated/v2/AsyncUserInputQuestion.js.map +1 -0
  52. package/dist/codex/generated/v2/AuthRecoveryNotification.d.ts +6 -0
  53. package/dist/codex/generated/v2/AuthRecoveryNotification.js +3 -0
  54. package/dist/codex/generated/v2/AuthRecoveryNotification.js.map +1 -0
  55. package/dist/codex/generated/v2/BedrockSetupParams.d.ts +0 -8
  56. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.d.ts +1 -0
  57. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js +3 -0
  58. package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js.map +1 -0
  59. package/dist/codex/generated/v2/BrowserUseConfig.d.ts +8 -0
  60. package/dist/codex/generated/v2/BrowserUseConfig.js +3 -0
  61. package/dist/codex/generated/v2/BrowserUseConfig.js.map +1 -0
  62. package/dist/codex/generated/v2/BrowserUseOriginPolicy.d.ts +11 -0
  63. package/dist/codex/generated/v2/BrowserUseOriginPolicy.js +3 -0
  64. package/dist/codex/generated/v2/BrowserUseOriginPolicy.js.map +1 -0
  65. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.d.ts +7 -0
  66. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js +3 -0
  67. package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js.map +1 -0
  68. package/dist/codex/generated/v2/BrowserUseRequirements.d.ts +7 -0
  69. package/dist/codex/generated/v2/CodexErrorInfo.d.ts +1 -1
  70. package/dist/codex/generated/v2/CollabAgentTool.d.ts +1 -1
  71. package/dist/codex/generated/v2/CollabAgentToolCallStatus.d.ts +1 -1
  72. package/dist/codex/generated/v2/CommandExecutionApprovalKind.d.ts +4 -0
  73. package/dist/codex/generated/v2/CommandExecutionApprovalKind.js +3 -0
  74. package/dist/codex/generated/v2/CommandExecutionApprovalKind.js.map +1 -0
  75. package/dist/codex/generated/v2/CommandExecutionRequestApprovalParams.d.ts +6 -0
  76. package/dist/codex/generated/v2/ComputerUseConfig.d.ts +8 -0
  77. package/dist/codex/generated/v2/ComputerUseConfig.js +3 -0
  78. package/dist/codex/generated/v2/ComputerUseConfig.js.map +1 -0
  79. package/dist/codex/generated/v2/ComputerUseMacosConfig.d.ts +6 -0
  80. package/dist/codex/generated/v2/ComputerUseMacosConfig.js +3 -0
  81. package/dist/codex/generated/v2/ComputerUseMacosConfig.js.map +1 -0
  82. package/dist/codex/generated/v2/ComputerUseMacosRequirements.d.ts +6 -0
  83. package/dist/codex/generated/v2/ComputerUseMacosRequirements.js +3 -0
  84. package/dist/codex/generated/v2/ComputerUseMacosRequirements.js.map +1 -0
  85. package/dist/codex/generated/v2/ComputerUseRequirements.d.ts +7 -0
  86. package/dist/codex/generated/v2/ComputerUseWindowsConfig.d.ts +8 -0
  87. package/dist/codex/generated/v2/ComputerUseWindowsConfig.js +3 -0
  88. package/dist/codex/generated/v2/ComputerUseWindowsConfig.js.map +1 -0
  89. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.d.ts +7 -0
  90. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js +3 -0
  91. package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js.map +1 -0
  92. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.d.ts +7 -0
  93. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js +3 -0
  94. package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js.map +1 -0
  95. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.d.ts +8 -0
  96. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js +3 -0
  97. package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js.map +1 -0
  98. package/dist/codex/generated/v2/Config.d.ts +4 -0
  99. package/dist/codex/generated/v2/ConfigRequirements.d.ts +4 -0
  100. package/dist/codex/generated/v2/CyberAccessProgram.d.ts +5 -0
  101. package/dist/codex/generated/v2/CyberAccessProgram.js +3 -0
  102. package/dist/codex/generated/v2/CyberAccessProgram.js.map +1 -0
  103. package/dist/codex/generated/v2/GetAccountRateLimitsResponse.d.ts +10 -0
  104. package/dist/codex/generated/v2/GuardianApprovalReviewAction.d.ts +7 -0
  105. package/dist/codex/generated/v2/HookEventName.d.ts +1 -1
  106. package/dist/codex/generated/v2/InAppBrowserRequirements.d.ts +3 -0
  107. package/dist/codex/generated/v2/InAppBrowserRequirements.js +3 -0
  108. package/dist/codex/generated/v2/InAppBrowserRequirements.js.map +1 -0
  109. package/dist/codex/generated/v2/ItemGuardianApprovalReviewCompletedNotification.d.ts +2 -0
  110. package/dist/codex/generated/v2/ItemGuardianApprovalReviewStartedNotification.d.ts +2 -0
  111. package/dist/codex/generated/v2/LoginAccountParams.d.ts +6 -0
  112. package/dist/codex/generated/v2/ManagedHooksRequirements.d.ts +1 -0
  113. package/dist/codex/generated/v2/McpServerConnectionStatus.d.ts +1 -0
  114. package/dist/codex/generated/v2/McpServerConnectionStatus.js +3 -0
  115. package/dist/codex/generated/v2/McpServerConnectionStatus.js.map +1 -0
  116. package/dist/codex/generated/v2/McpServerElicitationRequestParams.d.ts +5 -0
  117. package/dist/codex/generated/v2/McpServerEventNotification.d.ts +5 -0
  118. package/dist/codex/generated/v2/McpServerEventNotification.js +3 -0
  119. package/dist/codex/generated/v2/McpServerEventNotification.js.map +1 -0
  120. package/dist/codex/generated/v2/McpServerEventStreamNotification.d.ts +5 -0
  121. package/dist/codex/generated/v2/McpServerEventStreamNotification.js +3 -0
  122. package/dist/codex/generated/v2/McpServerEventStreamNotification.js.map +1 -0
  123. package/dist/codex/generated/v2/McpServerEventStreamStartParams.d.ts +9 -0
  124. package/dist/codex/generated/v2/McpServerEventStreamStartParams.js +3 -0
  125. package/dist/codex/generated/v2/McpServerEventStreamStartParams.js.map +1 -0
  126. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.d.ts +1 -0
  127. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js +3 -0
  128. package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js.map +1 -0
  129. package/dist/codex/generated/v2/McpServerEventStreamStopParams.d.ts +3 -0
  130. package/dist/codex/generated/v2/McpServerEventStreamStopParams.js +3 -0
  131. package/dist/codex/generated/v2/McpServerEventStreamStopParams.js.map +1 -0
  132. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.d.ts +1 -0
  133. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js +3 -0
  134. package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js.map +1 -0
  135. package/dist/codex/generated/v2/McpServerStatus.d.ts +5 -0
  136. package/dist/codex/generated/v2/MisalignmentErrorDetails.d.ts +15 -0
  137. package/dist/codex/generated/v2/MisalignmentErrorDetails.js +3 -0
  138. package/dist/codex/generated/v2/MisalignmentErrorDetails.js.map +1 -0
  139. package/dist/codex/generated/v2/MisalignmentSteer.d.ts +3 -0
  140. package/dist/codex/generated/v2/MisalignmentSteer.js +3 -0
  141. package/dist/codex/generated/v2/MisalignmentSteer.js.map +1 -0
  142. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.d.ts +19 -0
  143. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js +3 -0
  144. package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js.map +1 -0
  145. package/dist/codex/generated/v2/PluginReconcileParams.d.ts +6 -0
  146. package/dist/codex/generated/v2/PluginReconcileParams.js +3 -0
  147. package/dist/codex/generated/v2/PluginReconcileParams.js.map +1 -0
  148. package/dist/codex/generated/v2/PluginReconcileResponse.d.ts +23 -0
  149. package/dist/codex/generated/v2/PluginReconcileResponse.js +3 -0
  150. package/dist/codex/generated/v2/PluginReconcileResponse.js.map +1 -0
  151. package/dist/codex/generated/v2/Project.d.ts +4 -0
  152. package/dist/codex/generated/v2/ProjectListParams.d.ts +10 -0
  153. package/dist/codex/generated/v2/ProjectSortKey.d.ts +1 -0
  154. package/dist/codex/generated/v2/ProjectSortKey.js +3 -0
  155. package/dist/codex/generated/v2/ProjectSortKey.js.map +1 -0
  156. package/dist/codex/generated/v2/RawResponseCompletedNotification.d.ts +2 -0
  157. package/dist/codex/generated/v2/ResponseUsageMetadata.d.ts +8 -0
  158. package/dist/codex/generated/v2/ResponseUsageMetadata.js +3 -0
  159. package/dist/codex/generated/v2/ResponseUsageMetadata.js.map +1 -0
  160. package/dist/codex/generated/v2/SkillMetadata.d.ts +4 -0
  161. package/dist/codex/generated/v2/SubAgentActivityKind.d.ts +1 -1
  162. package/dist/codex/generated/v2/Thread.d.ts +11 -0
  163. package/dist/codex/generated/v2/ThreadForkParams.d.ts +3 -1
  164. package/dist/codex/generated/v2/ThreadItem.d.ts +9 -0
  165. package/dist/codex/generated/v2/ThreadReadParams.d.ts +3 -0
  166. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.d.ts +11 -0
  167. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js +3 -0
  168. package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js.map +1 -0
  169. package/dist/codex/generated/v2/ThreadRealtimeItem.d.ts +24 -0
  170. package/dist/codex/generated/v2/ThreadRealtimeItem.js +3 -0
  171. package/dist/codex/generated/v2/ThreadRealtimeItem.js.map +1 -0
  172. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.d.ts +8 -0
  173. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js +3 -0
  174. package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js.map +1 -0
  175. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.d.ts +8 -0
  176. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js +3 -0
  177. package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js.map +1 -0
  178. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.d.ts +8 -0
  179. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js +3 -0
  180. package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js.map +1 -0
  181. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.d.ts +1 -0
  182. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js +3 -0
  183. package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js.map +1 -0
  184. package/dist/codex/generated/v2/ThreadRealtimeStartTransport.d.ts +6 -0
  185. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.d.ts +1 -0
  186. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js +3 -0
  187. package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js.map +1 -0
  188. package/dist/codex/generated/v2/ThreadResumeParams.d.ts +3 -1
  189. package/dist/codex/generated/v2/ThreadShellCommandParams.d.ts +6 -0
  190. package/dist/codex/generated/v2/ThreadTimelineEntry.d.ts +31 -0
  191. package/dist/codex/generated/v2/ThreadTimelineEntry.js +3 -0
  192. package/dist/codex/generated/v2/ThreadTimelineEntry.js.map +1 -0
  193. package/dist/codex/generated/v2/ThreadTimelineListParams.d.ts +8 -0
  194. package/dist/codex/generated/v2/ThreadTimelineListParams.js +3 -0
  195. package/dist/codex/generated/v2/ThreadTimelineListParams.js.map +1 -0
  196. package/dist/codex/generated/v2/ThreadTimelineListResponse.d.ts +9 -0
  197. package/dist/codex/generated/v2/ThreadTimelineListResponse.js +3 -0
  198. package/dist/codex/generated/v2/ThreadTimelineListResponse.js.map +1 -0
  199. package/dist/codex/generated/v2/TurnError.d.ts +5 -0
  200. package/dist/codex/generated/v2/TurnSettingsUpdateParams.d.ts +34 -0
  201. package/dist/codex/generated/v2/TurnSettingsUpdateParams.js +3 -0
  202. package/dist/codex/generated/v2/TurnSettingsUpdateParams.js.map +1 -0
  203. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.d.ts +4 -0
  204. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js +3 -0
  205. package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js.map +1 -0
  206. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.d.ts +1 -0
  207. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js +3 -0
  208. package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js.map +1 -0
  209. package/dist/codex/generated/v2/TurnStartParams.d.ts +19 -0
  210. package/dist/codex/generated/v2/TurnToolOutput.d.ts +6 -0
  211. package/dist/codex/generated/v2/TurnToolOutput.js +3 -0
  212. package/dist/codex/generated/v2/TurnToolOutput.js.map +1 -0
  213. package/dist/codex/generated/v2/index.d.ts +46 -0
  214. package/dist/daemon/ownership.js +9 -1
  215. package/dist/daemon/ownership.js.map +1 -1
  216. package/dist/daemon/probe.js +1 -1
  217. package/dist/gateway/clientConnection.js +105 -19
  218. package/dist/gateway/clientConnection.js.map +1 -1
  219. package/dist/gateway/optimisticSideThreads.d.ts +11 -5
  220. package/dist/gateway/optimisticSideThreads.js +103 -47
  221. package/dist/gateway/optimisticSideThreads.js.map +1 -1
  222. package/dist/gateway/remoteRelay.js +2 -2
  223. package/dist/gateway/remoteRelay.js.map +1 -1
  224. package/dist/gateway/server.js +31 -1
  225. package/dist/gateway/server.js.map +1 -1
  226. package/dist/gateway/stockSideThreads.d.ts +3 -6
  227. package/dist/gateway/stockSideThreads.js +38 -43
  228. package/dist/gateway/stockSideThreads.js.map +1 -1
  229. package/dist/gateway/threadList.d.ts +9 -3
  230. package/dist/gateway/threadList.js +66 -15
  231. package/dist/gateway/threadList.js.map +1 -1
  232. package/dist/gateway/transientNotice.js +4 -4
  233. package/dist/gateway/transientNotice.js.map +1 -1
  234. package/dist/handoff/service.d.ts +10 -2
  235. package/dist/handoff/service.js +164 -106
  236. package/dist/handoff/service.js.map +1 -1
  237. package/dist/handoff/store.d.ts +21 -0
  238. package/dist/handoff/store.js +15 -0
  239. package/dist/handoff/store.js.map +1 -1
  240. package/dist/handoff/titleGeneration.d.ts +1 -0
  241. package/dist/handoff/titleGeneration.js.map +1 -1
  242. package/dist/management/setup.d.ts +6 -0
  243. package/dist/management/setup.js +11 -3
  244. package/dist/management/setup.js.map +1 -1
  245. package/dist/protocol/search.d.ts +24 -0
  246. package/dist/protocol/search.js +105 -0
  247. package/dist/protocol/search.js.map +1 -0
  248. package/dist/protocol/turnPagination.d.ts +16 -0
  249. package/dist/protocol/turnPagination.js +75 -35
  250. package/dist/protocol/turnPagination.js.map +1 -1
  251. package/dist/runtime/dependencies.js +1 -1
  252. package/dist/store/HybridStore.d.ts +4 -0
  253. package/dist/store/HybridStore.js +1 -1
  254. package/dist/store/HybridStore.js.map +1 -1
  255. package/dist/store/memoryStore.d.ts +6 -0
  256. package/dist/store/memoryStore.js +16 -0
  257. package/dist/store/memoryStore.js.map +1 -1
  258. package/dist/store/sqliteStore.d.ts +3 -0
  259. package/dist/store/sqliteStore.js +57 -0
  260. package/dist/store/sqliteStore.js.map +1 -1
  261. package/legal/THIRD_PARTY_NOTICES.md +160 -140
  262. package/package.json +6 -6
  263. package/scripts/install-claude-stack.sh +27 -4
  264. package/vendor/codex/continuation.md +5 -0
@@ -1,8 +1,9 @@
1
1
  import { DEFAULT_RENAME_PROMPT } from "../config/config.js";
2
2
  import { findStockSection } from "../gateway/stockRpc.js";
3
3
  import { projectItemIds, projectRpcToBackendThread, projectRpcToPublicThread, } from "../gateway/logicalThreadProjection.js";
4
- import { invalidParams } from "../protocol/errors.js";
5
- import { paginateTurns, turnCursor } from "../protocol/turnPagination.js";
4
+ import { invalidParams, invalidRequest } from "../protocol/errors.js";
5
+ import { historyCursors, paginateItems, paginateTurns } from "../protocol/turnPagination.js";
6
+ import { searchTurnOccurrences } from "../protocol/search.js";
6
7
  import { filterSortThreads } from "../store/threadFilter.js";
7
8
  import { v7 as uuidv7 } from "uuid";
8
9
  import { stockSwitchThreadSource, ProviderEpochs, } from "./providerEpochs.js";
@@ -167,23 +168,25 @@ function stagedSettings(base, pending) {
167
168
  function pageTurns(turns, params) {
168
169
  return paginateTurns(turns, params, ["hyb-overlay-turn:", "hyb-turn:"]);
169
170
  }
171
+ /** Full stock history without the deprecated paginated `includeTurns` hydration: page `thread/turns/list` instead. */
172
+ async function readStockThread(stock, threadId) {
173
+ const { thread } = await stock.request("thread/read", { threadId, includeTurns: false });
174
+ if (thread.historyMode !== "paginated") {
175
+ return (await stock.request("thread/read", { threadId, includeTurns: true })).thread;
176
+ }
177
+ const turns = [];
178
+ let cursor = null;
179
+ do {
180
+ const page = await stock.request("thread/turns/list", {
181
+ threadId, cursor, limit: 100, sortDirection: "asc", itemsView: "full",
182
+ });
183
+ turns.push(...page.data);
184
+ cursor = page.nextCursor;
185
+ } while (cursor);
186
+ return { ...thread, turns };
187
+ }
170
188
  function pageItems(turns, params) {
171
- if (params.cursor && !params.cursor.startsWith("hyb-overlay-item:"))
172
- throw invalidParams("Invalid handoff item cursor.");
173
- const offset = params.cursor ? Number(params.cursor.slice("hyb-overlay-item:".length)) : 0;
174
- if (!Number.isInteger(offset) || offset < 0)
175
- throw invalidParams("Invalid handoff item cursor.");
176
- const items = turns.flatMap((turn) => params.turnId && turn.id !== params.turnId
177
- ? []
178
- : turn.items.map((item) => ({ turnId: turn.id, item })));
179
- const ordered = params.sortDirection === "desc" ? [...items].reverse() : items;
180
- const limit = Math.max(1, Math.min(params.limit ?? 50, 100));
181
- const data = ordered.slice(offset, offset + limit);
182
- return {
183
- data,
184
- nextCursor: offset + data.length < ordered.length ? `hyb-overlay-item:${offset + data.length}` : null,
185
- backwardsCursor: data.length > 0 ? `hyb-overlay-item:${Math.max(0, offset - limit)}` : null,
186
- };
189
+ return paginateItems(turns, params, ["hyb-overlay-item:"]);
187
190
  }
188
191
  function messageThreadId(message) {
189
192
  if (!message.params || typeof message.params !== "object")
@@ -218,7 +221,7 @@ export class CrossProviderForks {
218
221
  titleTurns = new Map();
219
222
  stockServerRequests = new Map();
220
223
  stockServerRequestAliases = new Map();
221
- recentDurableProviders = new Map();
224
+ recentDurableThreads = new Map();
222
225
  adminTails = new Map();
223
226
  lineage;
224
227
  legacyMirror;
@@ -237,6 +240,9 @@ export class CrossProviderForks {
237
240
  }
238
241
  pending(threadId) { return this.store.getPending(threadId); }
239
242
  logical(threadId) { return this.epochs.resolve(threadId); }
243
+ currentBackendId(publicThreadId) {
244
+ return this.epochs.resolve(publicThreadId)?.epoch.backendThreadId;
245
+ }
240
246
  hiddenBackendIds(provider) { return this.epochs.hiddenBackendIds(provider); }
241
247
  catalogTombstones() { return this.store.remoteCatalogTombstones(); }
242
248
  async sideSnapshot(params, targetThreadId) {
@@ -399,6 +405,16 @@ export class CrossProviderForks {
399
405
  return { provider: resolved.epoch.provider, result: {} };
400
406
  }
401
407
  }
408
+ if (method === "thread/searchOccurrences") {
409
+ const stock = this.daemonStock ?? clientStock;
410
+ const turns = resolved.epoch.backendThreadId.startsWith("ccodex-provisional:")
411
+ ? this.store.listLogicalTurns(publicThreadId).map((value) => value.turn)
412
+ : await this.visibleTurns(publicThreadId, await this.currentBackendTurns(resolved, stock), stock);
413
+ return {
414
+ provider: resolved.epoch.provider,
415
+ result: searchTurnOccurrences(publicThreadId, turns, publicParams),
416
+ };
417
+ }
402
418
  if (resolved.epoch.backendThreadId.startsWith("ccodex-provisional:")) {
403
419
  return this.requestProvisionalLogical(method, publicParams, resolved);
404
420
  }
@@ -420,33 +436,25 @@ export class CrossProviderForks {
420
436
  const includeTurns = resume
421
437
  ? !resume.excludeTurns
422
438
  : params.includeTurns ?? false;
423
- const backendTurns = resume?.initialTurnsPage && !includeTurns
424
- ? (await stock.request("thread/read", {
425
- threadId: resolved.epoch.backendThreadId,
426
- includeTurns: true,
427
- })).thread.turns
439
+ const backendTurns = resume && !includeTurns
440
+ ? (await readStockThread(stock, resolved.epoch.backendThreadId)).turns
428
441
  : result.thread.turns;
442
+ const visible = resume ? await this.visibleTurns(publicThreadId, backendTurns, stock) : [];
429
443
  const initialTurnsPage = resume?.initialTurnsPage
430
- ? pageTurns(await this.visibleTurns(publicThreadId, backendTurns, stock), {
431
- threadId: publicThreadId,
432
- ...resume.initialTurnsPage,
433
- })
434
- : "initialTurnsPage" in result ? result.initialTurnsPage : undefined;
444
+ ? pageTurns(visible, { threadId: publicThreadId, ...resume.initialTurnsPage })
445
+ : undefined;
435
446
  return {
436
447
  provider: "stock",
437
448
  result: {
438
449
  ...result,
439
450
  thread: this.epochs.projectThread(publicThreadId, projectItemIds(result.thread, resolved.epoch.id), includeTurns, includeTurns ? (await this.historicalTurns(publicThreadId, stock)).map((entry) => entry.turn) : []),
440
- ...(resume ? { initialTurnsPage } : {}),
451
+ ...(resume ? { initialTurnsPage, ...historyCursors(visible) } : {}),
441
452
  },
442
453
  };
443
454
  }
444
455
  if (method === "thread/turns/list" || method === "thread/items/list") {
445
- const read = await stock.request("thread/read", {
446
- threadId: resolved.epoch.backendThreadId,
447
- includeTurns: true,
448
- });
449
- const turns = await this.visibleTurns(publicThreadId, read.thread.turns, stock);
456
+ const read = await readStockThread(stock, resolved.epoch.backendThreadId);
457
+ const turns = await this.visibleTurns(publicThreadId, read.turns, stock);
450
458
  return {
451
459
  provider: "stock",
452
460
  result: method === "thread/turns/list"
@@ -478,19 +486,18 @@ export class CrossProviderForks {
478
486
  const thread = this.epochs.projectThread(publicThreadId, projectItemIds(response.thread, resolved.epoch.id), !resume.excludeTurns, !resume.excludeTurns
479
487
  ? (await this.historicalTurns(publicThreadId, this.daemonStock ?? clientStock)).map((entry) => entry.turn)
480
488
  : []);
481
- const backendTurns = resume.initialTurnsPage && resume.excludeTurns
489
+ const backendTurns = resume.excludeTurns
482
490
  ? this.claude.readThread(threadId, true).thread.turns
483
491
  : response.thread.turns;
492
+ const visible = await this.visibleTurns(publicThreadId, backendTurns, this.daemonStock ?? clientStock);
484
493
  return {
485
494
  provider: "claude",
486
495
  result: {
487
496
  ...response,
488
497
  thread,
498
+ ...historyCursors(visible),
489
499
  ...(resume.initialTurnsPage ? {
490
- initialTurnsPage: pageTurns(await this.visibleTurns(publicThreadId, backendTurns, this.daemonStock ?? clientStock), {
491
- threadId: publicThreadId,
492
- ...resume.initialTurnsPage,
493
- }),
500
+ initialTurnsPage: pageTurns(visible, { threadId: publicThreadId, ...resume.initialTurnsPage }),
494
501
  } : {}),
495
502
  },
496
503
  after: async () => prepared.notifyGoalSnapshot((event, eventParams) => {
@@ -621,6 +628,41 @@ export class CrossProviderForks {
621
628
  if (method === "turn/steer") {
622
629
  return { provider: "claude", result: await this.claude.steerTurn(params) };
623
630
  }
631
+ if (method === "thread/queue/list") {
632
+ return { provider: "claude", result: this.claude.listQueue(params) };
633
+ }
634
+ if (method === "app/list" || method === "mcpServerStatus/list") {
635
+ return { provider: "claude", result: { data: [], nextCursor: null } };
636
+ }
637
+ if (method === "app/installed")
638
+ return { provider: "claude", result: { apps: [] } };
639
+ if (method === "thread/queue/add") {
640
+ const prepared = await this.claude.addQueuedSubmission(params);
641
+ return { provider: "claude", result: prepared.response, after: prepared.after };
642
+ }
643
+ if (method === "thread/queue/update") {
644
+ return {
645
+ provider: "claude",
646
+ result: await this.claude.updateQueuedSubmission(params),
647
+ };
648
+ }
649
+ if (method === "thread/queue/delete") {
650
+ return {
651
+ provider: "claude",
652
+ result: await this.claude.deleteQueuedSubmission(params),
653
+ };
654
+ }
655
+ if (method === "thread/queue/reorder") {
656
+ return { provider: "claude", result: await this.claude.reorderQueue(params) };
657
+ }
658
+ if (method === "thread/queue/start") {
659
+ const prepared = await this.claude.prepareQueueStart(params);
660
+ return {
661
+ provider: "claude",
662
+ result: prepared.response,
663
+ after: async () => { await prepared.announce(); prepared.start(); },
664
+ };
665
+ }
624
666
  throw invalidParams(`Method '${method}' is not implemented for a migrated Claude task yet.`);
625
667
  }
626
668
  requestProvisionalLogical(method, params, resolved) {
@@ -638,10 +680,12 @@ export class CrossProviderForks {
638
680
  }
639
681
  if (method === "thread/resume") {
640
682
  const settings = resolved.epoch.settings;
683
+ const resume = params;
641
684
  return {
642
685
  provider: resolved.epoch.provider,
643
686
  result: {
644
- thread: thread(!params.excludeTurns),
687
+ thread: thread(!resume.excludeTurns),
688
+ ...historyCursors(turns),
645
689
  model: resolved.epoch.model,
646
690
  modelProvider: resolved.epoch.provider === "claude" ? "claude" : "openai",
647
691
  serviceTier: typeof settings.serviceTier === "string" ? settings.serviceTier : null,
@@ -655,7 +699,9 @@ export class CrossProviderForks {
655
699
  activePermissionProfile: settings.activePermissionProfile ?? null,
656
700
  reasoningEffort: settings.reasoningEffort ?? settings.effort ?? null,
657
701
  multiAgentMode: settings.multiAgentMode ?? "explicitRequestOnly",
658
- initialTurnsPage: null,
702
+ initialTurnsPage: resume.initialTurnsPage
703
+ ? pageTurns(turns, { threadId: resolved.logical.publicThreadId, ...resume.initialTurnsPage })
704
+ : null,
659
705
  },
660
706
  };
661
707
  }
@@ -690,9 +736,15 @@ export class CrossProviderForks {
690
736
  }
691
737
  const currentTurns = await this.currentBackendTurns(source, this.daemonStock ?? clientStock);
692
738
  const visible = await this.snapshotTurns(params.threadId, currentTurns, this.daemonStock ?? clientStock);
693
- const boundaryIndex = visible.findLastIndex((turn) => turn.turn.status === "completed" && turn.epochId && turn.providerTurnId);
739
+ const requested = params.lastTurnId ?? params.beforeTurnId;
740
+ const requestedIndex = requested ? visible.findIndex((turn) => turn.turn.id === requested) : undefined;
741
+ if (requestedIndex === -1)
742
+ throw invalidRequest(`turn not found: ${requested}`);
743
+ const boundaryIndex = requestedIndex === undefined
744
+ ? visible.findLastIndex((turn) => turn.turn.status === "completed" && turn.epochId && turn.providerTurnId)
745
+ : params.lastTurnId ? requestedIndex : requestedIndex - 1;
694
746
  const boundary = visible[boundaryIndex];
695
- if (!boundary?.epochId || !boundary.providerTurnId) {
747
+ if (!boundary?.epochId || !boundary.providerTurnId || boundary.turn.status !== "completed") {
696
748
  throw invalidParams("Cannot fork before the task has a completed provider turn.");
697
749
  }
698
750
  const selectedBoundary = this.lineage.getEpoch(boundary.epochId);
@@ -810,11 +862,7 @@ export class CrossProviderForks {
810
862
  throw invalidParams(`Unknown turn '${params.beforeTurnId}'.`);
811
863
  return keep;
812
864
  }, clientStock, connectionId);
813
- return {
814
- thread: { ...thread, turns: [] },
815
- turnsBackwardsCursor: thread.turns.length ? turnCursor(thread.turns.at(-1).id, true) : null,
816
- itemsBackwardsCursor: thread.turns.some((turn) => turn.items.length) ? "hyb-overlay-item:0" : null,
817
- };
865
+ return { thread: { ...thread, turns: [] }, ...historyCursors(thread.turns) };
818
866
  }
819
867
  async truncateLogicalThread(publicThreadId, keepOf, clientStock, connectionId) {
820
868
  const params = { threadId: publicThreadId };
@@ -824,7 +872,8 @@ export class CrossProviderForks {
824
872
  throw invalidParams(`Unknown logical thread '${params.threadId}'.`);
825
873
  const target = await this.hydrate(unresolvedTarget, this.daemonStock ?? clientStock);
826
874
  const pendingFork = selection?.status === "pending" ? selection : undefined;
827
- const currentTurns = await this.currentBackendTurns(target, this.daemonStock ?? clientStock);
875
+ const backend = await this.backendThread(target, this.daemonStock ?? clientStock);
876
+ const currentTurns = backend?.turns ?? [];
828
877
  const turns = await this.snapshotTurns(params.threadId, currentTurns, this.daemonStock ?? clientStock);
829
878
  const keep = keepOf(turns);
830
879
  if (keep <= 0)
@@ -842,25 +891,10 @@ export class CrossProviderForks {
842
891
  }
843
892
  const selectedEpoch = await this.hydrateEpoch(selectedBoundary.epochId, this.daemonStock ?? clientStock);
844
893
  if (!pendingFork && selectedEpoch.id === target.epoch.id) {
845
- if (numTurns === 0) {
846
- const backend = target.epoch.provider === "claude"
847
- ? this.claude.readThread(target.epoch.backendThreadId, true).thread
848
- : (await clientStock.request("thread/read", {
849
- threadId: target.epoch.backendThreadId,
850
- includeTurns: true,
851
- })).thread;
852
- return { thread: this.epochs.projectThread(params.threadId, projectItemIds(backend, target.epoch.id), true, (await this.historicalTurns(params.threadId, this.daemonStock ?? clientStock)).map((entry) => entry.turn)) };
853
- }
854
- const rolled = target.epoch.provider === "claude"
855
- ? await this.claude.rollbackThread({
856
- threadId: target.epoch.backendThreadId,
857
- numTurns,
858
- })
859
- : await clientStock.request("thread/rollback", {
860
- threadId: target.epoch.backendThreadId,
861
- numTurns,
862
- });
863
- return { thread: this.epochs.projectThread(params.threadId, projectItemIds(rolled.thread, target.epoch.id), true, (await this.historicalTurns(params.threadId, this.daemonStock ?? clientStock)).map((entry) => entry.turn)) };
894
+ const rolled = numTurns === 0
895
+ ? backend
896
+ : await this.truncateBackend(target, backend, turns[keep], numTurns, clientStock);
897
+ return { thread: this.epochs.projectThread(params.threadId, projectItemIds(rolled, target.epoch.id), true, (await this.historicalTurns(params.threadId, this.daemonStock ?? clientStock)).map((entry) => entry.turn)) };
864
898
  }
865
899
  let forked;
866
900
  let stockBuildOwner;
@@ -1153,10 +1187,7 @@ export class CrossProviderForks {
1153
1187
  if (job.targetBackendThreadId && job.targetProviderTurnId) {
1154
1188
  const target = job.targetProvider === "claude"
1155
1189
  ? this.claude.readThread(job.targetBackendThreadId, true).thread
1156
- : (await stock.request("thread/read", {
1157
- threadId: job.targetBackendThreadId,
1158
- includeTurns: true,
1159
- })).thread;
1190
+ : await readStockThread(stock, job.targetBackendThreadId);
1160
1191
  if (target.turns.some((turn) => turn.id === job.targetProviderTurnId)) {
1161
1192
  const material = await this.providerSwitchMaterial(job, stock, `${HANDOFF_DAEMON_CONNECTION_ID}:recovery:${job.id}`);
1162
1193
  const sealed = await this.finalizeProviderSwitch(job, target, material.targetSettings, material.sourceTurns, stock);
@@ -1288,7 +1319,7 @@ export class CrossProviderForks {
1288
1319
  if (items.length > 0)
1289
1320
  await stock.request("thread/inject_items", { threadId: created.thread.id, items });
1290
1321
  const threads = this.systemEphemeralThreads.get(connectionId) ?? new Map();
1291
- threads.set(created.thread.id, { durableProvider: "claude" });
1322
+ threads.set(created.thread.id, { durableProvider: "claude", durableThreadId: params.threadId });
1292
1323
  this.systemEphemeralThreads.set(connectionId, threads);
1293
1324
  return {
1294
1325
  ...created,
@@ -1336,9 +1367,9 @@ export class CrossProviderForks {
1336
1367
  const directStart = !("threadId" in params);
1337
1368
  if (params.ephemeral !== true)
1338
1369
  return;
1339
- const durableProvider = "threadId" in params
1340
- ? this.claude.ownsThread(params.threadId) ? "claude" : "stock"
1341
- : this.recentDurableProviders.get(connectionId) ?? "stock";
1370
+ const owner = "threadId" in params
1371
+ ? { durableProvider: this.claude.ownsThread(params.threadId) ? "claude" : "stock", durableThreadId: params.threadId }
1372
+ : this.recentDurableThreads.get(connectionId) ?? { durableProvider: "stock" };
1342
1373
  const candidates = directStart && params.threadSource !== "system" && params.threadSource !== "user"
1343
1374
  ? this.directTitleCandidates
1344
1375
  : params.threadSource === "system" ? this.systemEphemeralThreads : undefined;
@@ -1347,11 +1378,11 @@ export class CrossProviderForks {
1347
1378
  const threads = candidates.get(connectionId) ?? new Map();
1348
1379
  if (threads.size >= 64 && !threads.has(threadId))
1349
1380
  threads.delete(threads.keys().next().value);
1350
- threads.set(threadId, { durableProvider });
1381
+ threads.set(threadId, owner);
1351
1382
  candidates.set(connectionId, threads);
1352
1383
  }
1353
- observeDurableThread(connectionId, provider) {
1354
- this.recentDurableProviders.set(connectionId, provider);
1384
+ observeDurableThread(connectionId, provider, threadId) {
1385
+ this.recentDurableThreads.set(connectionId, { durableProvider: provider, durableThreadId: threadId });
1355
1386
  }
1356
1387
  observeDurableTurn(connectionId, params) {
1357
1388
  if (this.systemEphemeralThreads.get(connectionId)?.has(params.threadId)
@@ -1362,7 +1393,9 @@ export class CrossProviderForks {
1362
1393
  return;
1363
1394
  const durableProvider = this.claude.ownsThread(params.threadId) ? "claude" : "stock";
1364
1395
  const turn = [...this.titleTurns.values()].reverse()
1365
- .find((candidate) => candidate.connectionId === connectionId && candidate.userPrompt.trim() === text);
1396
+ .find((candidate) => candidate.connectionId === connectionId
1397
+ && (!candidate.durableThreadId || candidate.durableThreadId === params.threadId)
1398
+ && candidate.userPrompt.trim() === text);
1366
1399
  if (turn)
1367
1400
  turn.durableProvider = durableProvider;
1368
1401
  }
@@ -1387,6 +1420,7 @@ export class CrossProviderForks {
1387
1420
  return params;
1388
1421
  const turn = {
1389
1422
  durableProvider: owner.durableProvider,
1423
+ durableThreadId: owner.durableThreadId,
1390
1424
  connectionId,
1391
1425
  userPrompt: prompt.userPrompt,
1392
1426
  outputSchema: prompt.outputSchema,
@@ -1397,6 +1431,19 @@ export class CrossProviderForks {
1397
1431
  : item);
1398
1432
  return { ...params, input };
1399
1433
  }
1434
+ async persistGeneratedTitle(message) {
1435
+ if (message.method !== "turn/completed")
1436
+ return;
1437
+ const params = message.params;
1438
+ const title = this.titleTurns.get(params.threadId);
1439
+ if (params.turn.status !== "completed" || title?.durableProvider !== "claude"
1440
+ || !title.durableThreadId || !title.output)
1441
+ return;
1442
+ await this.claude.setGeneratedThreadName({
1443
+ threadId: title.durableThreadId,
1444
+ name: JSON.parse(title.output).title,
1445
+ }, title.userPrompt);
1446
+ }
1400
1447
  rewriteTitleMessages(message) {
1401
1448
  if (!message.params || typeof message.params !== "object")
1402
1449
  return undefined;
@@ -1513,7 +1560,7 @@ export class CrossProviderForks {
1513
1560
  const threads = this.systemEphemeralThreads.get(connectionId) ?? new Map();
1514
1561
  this.systemEphemeralThreads.delete(connectionId);
1515
1562
  this.directTitleCandidates.delete(connectionId);
1516
- this.recentDurableProviders.delete(connectionId);
1563
+ this.recentDurableThreads.delete(connectionId);
1517
1564
  for (const threadId of threads.keys())
1518
1565
  this.titleTurns.delete(threadId);
1519
1566
  await Promise.allSettled([...threads.keys()].map((threadId) => stock.request("thread/delete", { threadId })));
@@ -1561,6 +1608,7 @@ export class CrossProviderForks {
1561
1608
  const full = await this.fullOverlayTurns(params.threadId, overlay, stock);
1562
1609
  return {
1563
1610
  ...result,
1611
+ ...historyCursors(full),
1564
1612
  thread: this.patchThread(result.thread, overlay, !params.excludeTurns, full),
1565
1613
  initialTurnsPage: params.initialTurnsPage ? pageTurns(full, {
1566
1614
  threadId: params.threadId,
@@ -1598,10 +1646,10 @@ export class CrossProviderForks {
1598
1646
  }
1599
1647
  else {
1600
1648
  const [read, resume] = await Promise.all([
1601
- stock.request("thread/read", { threadId, includeTurns: true }),
1649
+ readStockThread(stock, threadId),
1602
1650
  stock.request("thread/resume", { threadId, excludeTurns: true }),
1603
1651
  ]);
1604
- resolved = this.epochs.seed(read.thread, "stock", resume.model, resume);
1652
+ resolved = this.epochs.seed(read, "stock", resume.model, resume);
1605
1653
  }
1606
1654
  }
1607
1655
  if (resolved.epoch.provider !== pending.sourceProvider) {
@@ -1610,17 +1658,32 @@ export class CrossProviderForks {
1610
1658
  this.store.setPending({ ...pending, expectedEpochId: resolved.epoch.id });
1611
1659
  return this.epochs.resolve(threadId);
1612
1660
  }
1613
- async currentBackendTurns(resolved, stock) {
1661
+ async backendThread(resolved, stock) {
1614
1662
  if (resolved.epoch.backendThreadId.startsWith("ccodex-provisional:"))
1615
- return [];
1616
- if (resolved.epoch.provider === "claude") {
1617
- return this.claude.readThread(resolved.epoch.backendThreadId, true).thread.turns;
1663
+ return undefined;
1664
+ if (resolved.epoch.provider === "claude")
1665
+ return this.claude.readThread(resolved.epoch.backendThreadId, true).thread;
1666
+ return readStockThread(stock, resolved.epoch.backendThreadId);
1667
+ }
1668
+ /** Drops the current epoch's trailing turns: `thread/revert` on paginated backends, `thread/rollback` on legacy ones. */
1669
+ async truncateBackend(target, backend, firstDropped, numTurns, clientStock) {
1670
+ const threadId = target.epoch.backendThreadId;
1671
+ if (backend.historyMode !== "paginated") {
1672
+ const rolled = target.epoch.provider === "claude"
1673
+ ? await this.claude.rollbackThread({ threadId, numTurns })
1674
+ : await clientStock.request("thread/rollback", { threadId, numTurns });
1675
+ return rolled.thread;
1618
1676
  }
1619
- const read = await stock.request("thread/read", {
1620
- threadId: resolved.epoch.backendThreadId,
1621
- includeTurns: true,
1622
- });
1623
- return read.thread.turns;
1677
+ if (!firstDropped.providerTurnId)
1678
+ throw invalidParams("Rollback has no provider-backed turn boundary.");
1679
+ const revert = { threadId, beforeTurnId: firstDropped.providerTurnId };
1680
+ const reverted = target.epoch.provider === "claude"
1681
+ ? await this.claude.revertThread(revert)
1682
+ : await clientStock.request("thread/revert", revert);
1683
+ return { ...reverted.thread, turns: backend.turns.slice(0, backend.turns.length - numTurns) };
1684
+ }
1685
+ async currentBackendTurns(resolved, stock) {
1686
+ return (await this.backendThread(resolved, stock))?.turns ?? [];
1624
1687
  }
1625
1688
  async hydrate(resolved, stock) {
1626
1689
  if (resolved.epoch.backendThreadId.startsWith("ccodex-provisional:"))
@@ -1713,10 +1776,7 @@ export class CrossProviderForks {
1713
1776
  if (!turns) {
1714
1777
  turns = epoch.provider === "claude"
1715
1778
  ? this.claude.readThread(epoch.backendThreadId, true).thread.turns
1716
- : (await stock.request("thread/read", {
1717
- threadId: epoch.backendThreadId,
1718
- includeTurns: true,
1719
- })).thread.turns;
1779
+ : (await readStockThread(stock, epoch.backendThreadId)).turns;
1720
1780
  loaded.set(epoch.epochId, turns);
1721
1781
  }
1722
1782
  const start = turns.findIndex((turn) => turn.id === segment.startTurnId);
@@ -1818,19 +1878,16 @@ export class CrossProviderForks {
1818
1878
  };
1819
1879
  }
1820
1880
  const [read, resume] = await Promise.all([
1821
- stock.request("thread/read", {
1822
- threadId: resolved.epoch.backendThreadId,
1823
- includeTurns: true,
1824
- }),
1881
+ readStockThread(stock, resolved.epoch.backendThreadId),
1825
1882
  stock.request("thread/resume", {
1826
1883
  threadId: resolved.epoch.backendThreadId,
1827
1884
  excludeTurns: true,
1828
1885
  }),
1829
1886
  ]);
1830
1887
  return {
1831
- thread: read.thread,
1832
- backendTurns: read.thread.turns,
1833
- turns: await this.visibleTurns(job.publicThreadId, read.thread.turns, stock),
1888
+ thread: read,
1889
+ backendTurns: read.turns,
1890
+ turns: await this.visibleTurns(job.publicThreadId, read.turns, stock),
1834
1891
  settings: resume,
1835
1892
  };
1836
1893
  }
@@ -1882,6 +1939,7 @@ export class CrossProviderForks {
1882
1939
  threadId: resolved.epoch.backendThreadId,
1883
1940
  model: resolved.epoch.model,
1884
1941
  ephemeral: true,
1942
+ excludeTurns: true,
1885
1943
  threadSource: "subAgent",
1886
1944
  });
1887
1945
  try {
@@ -2165,8 +2223,8 @@ export class CrossProviderForks {
2165
2223
  };
2166
2224
  }
2167
2225
  async fullOverlayTurns(threadId, overlay, stock) {
2168
- const read = await stock.request("thread/read", { threadId, includeTurns: true });
2169
- return [...overlay.inheritedTurns, ...read.thread.turns];
2226
+ const read = await readStockThread(stock, threadId);
2227
+ return [...overlay.inheritedTurns, ...read.turns];
2170
2228
  }
2171
2229
  }
2172
2230
  //# sourceMappingURL=service.js.map