@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.
- package/README.md +4 -2
- package/agents/codex-wrapper.md +1 -0
- package/config/compatibility.json +5 -5
- package/dist/claude/inputMapper.d.ts +5 -0
- package/dist/claude/inputMapper.js +9 -0
- package/dist/claude/inputMapper.js.map +1 -1
- package/dist/claude/rateLimits.d.ts +2 -1
- package/dist/claude/rateLimits.js +12 -16
- package/dist/claude/rateLimits.js.map +1 -1
- package/dist/claude/service.d.ts +41 -1
- package/dist/claude/service.js +166 -69
- package/dist/claude/service.js.map +1 -1
- package/dist/claude/session/commands.d.ts +36 -0
- package/dist/claude/session/goalState.d.ts +5 -0
- package/dist/claude/session/goalState.js +22 -0
- package/dist/claude/session/goalState.js.map +1 -1
- package/dist/claude/session/providerRuntimeFactory.js +15 -7
- package/dist/claude/session/providerRuntimeFactory.js.map +1 -1
- package/dist/claude/session/repository.d.ts +3 -0
- package/dist/claude/session/repository.js +2 -0
- package/dist/claude/session/repository.js.map +1 -1
- package/dist/claude/session/runtime.d.ts +10 -0
- package/dist/claude/session/runtime.js +45 -3
- package/dist/claude/session/runtime.js.map +1 -1
- package/dist/claude/session/scopeState.js +1 -0
- package/dist/claude/session/scopeState.js.map +1 -1
- package/dist/claude/session/session.d.ts +1 -0
- package/dist/claude/session/session.js +162 -55
- package/dist/claude/session/session.js.map +1 -1
- package/dist/claude/skillCatalog.js +1 -0
- package/dist/claude/skillCatalog.js.map +1 -1
- package/dist/claude/statusCommand.js +1 -2
- package/dist/claude/statusCommand.js.map +1 -1
- package/dist/codex/generated/AuthMode.d.ts +1 -1
- package/dist/codex/generated/ClientRequest.d.ts +25 -0
- package/dist/codex/generated/InternalSessionSource.d.ts +1 -1
- package/dist/codex/generated/ResponseItem.d.ts +3 -1
- package/dist/codex/generated/ResponseItemRuntimeSchema.js +2 -2
- package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -1
- package/dist/codex/generated/ServerNotification.d.ts +23 -0
- package/dist/codex/generated/ServerNotificationEnvelope.d.ts +23 -0
- package/dist/codex/generated/v2/AllowDenyRequirement.d.ts +1 -0
- package/dist/codex/generated/v2/AllowDenyRequirement.js +3 -0
- package/dist/codex/generated/v2/AllowDenyRequirement.js.map +1 -0
- package/dist/codex/generated/v2/AppLinksConfig.d.ts +11 -0
- package/dist/codex/generated/v2/AppLinksConfig.js +3 -0
- package/dist/codex/generated/v2/AppLinksConfig.js.map +1 -0
- package/dist/codex/generated/v2/AppsConfig.d.ts +5 -0
- package/dist/codex/generated/v2/AsyncUserInputQuestion.d.ts +4 -0
- package/dist/codex/generated/v2/AsyncUserInputQuestion.js +3 -0
- package/dist/codex/generated/v2/AsyncUserInputQuestion.js.map +1 -0
- package/dist/codex/generated/v2/AuthRecoveryNotification.d.ts +6 -0
- package/dist/codex/generated/v2/AuthRecoveryNotification.js +3 -0
- package/dist/codex/generated/v2/AuthRecoveryNotification.js.map +1 -0
- package/dist/codex/generated/v2/BedrockSetupParams.d.ts +0 -8
- package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.d.ts +1 -0
- package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js +3 -0
- package/dist/codex/generated/v2/BrowserUseAccessApprovalLifetime.js.map +1 -0
- package/dist/codex/generated/v2/BrowserUseConfig.d.ts +8 -0
- package/dist/codex/generated/v2/BrowserUseConfig.js +3 -0
- package/dist/codex/generated/v2/BrowserUseConfig.js.map +1 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicy.d.ts +11 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicy.js +3 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicy.js.map +1 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.d.ts +7 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js +3 -0
- package/dist/codex/generated/v2/BrowserUseOriginPolicyConfig.js.map +1 -0
- package/dist/codex/generated/v2/BrowserUseRequirements.d.ts +7 -0
- package/dist/codex/generated/v2/CodexErrorInfo.d.ts +1 -1
- package/dist/codex/generated/v2/CollabAgentTool.d.ts +1 -1
- package/dist/codex/generated/v2/CollabAgentToolCallStatus.d.ts +1 -1
- package/dist/codex/generated/v2/CommandExecutionApprovalKind.d.ts +4 -0
- package/dist/codex/generated/v2/CommandExecutionApprovalKind.js +3 -0
- package/dist/codex/generated/v2/CommandExecutionApprovalKind.js.map +1 -0
- package/dist/codex/generated/v2/CommandExecutionRequestApprovalParams.d.ts +6 -0
- package/dist/codex/generated/v2/ComputerUseConfig.d.ts +8 -0
- package/dist/codex/generated/v2/ComputerUseConfig.js +3 -0
- package/dist/codex/generated/v2/ComputerUseConfig.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseMacosConfig.d.ts +6 -0
- package/dist/codex/generated/v2/ComputerUseMacosConfig.js +3 -0
- package/dist/codex/generated/v2/ComputerUseMacosConfig.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseMacosRequirements.d.ts +6 -0
- package/dist/codex/generated/v2/ComputerUseMacosRequirements.js +3 -0
- package/dist/codex/generated/v2/ComputerUseMacosRequirements.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseRequirements.d.ts +7 -0
- package/dist/codex/generated/v2/ComputerUseWindowsConfig.d.ts +8 -0
- package/dist/codex/generated/v2/ComputerUseWindowsConfig.js +3 -0
- package/dist/codex/generated/v2/ComputerUseWindowsConfig.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.d.ts +7 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js +3 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeConfig.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.d.ts +7 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js +3 -0
- package/dist/codex/generated/v2/ComputerUseWindowsExeRequirement.js.map +1 -0
- package/dist/codex/generated/v2/ComputerUseWindowsRequirements.d.ts +8 -0
- package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js +3 -0
- package/dist/codex/generated/v2/ComputerUseWindowsRequirements.js.map +1 -0
- package/dist/codex/generated/v2/Config.d.ts +4 -0
- package/dist/codex/generated/v2/ConfigRequirements.d.ts +4 -0
- package/dist/codex/generated/v2/CyberAccessProgram.d.ts +5 -0
- package/dist/codex/generated/v2/CyberAccessProgram.js +3 -0
- package/dist/codex/generated/v2/CyberAccessProgram.js.map +1 -0
- package/dist/codex/generated/v2/GetAccountRateLimitsResponse.d.ts +10 -0
- package/dist/codex/generated/v2/GuardianApprovalReviewAction.d.ts +7 -0
- package/dist/codex/generated/v2/HookEventName.d.ts +1 -1
- package/dist/codex/generated/v2/InAppBrowserRequirements.d.ts +3 -0
- package/dist/codex/generated/v2/InAppBrowserRequirements.js +3 -0
- package/dist/codex/generated/v2/InAppBrowserRequirements.js.map +1 -0
- package/dist/codex/generated/v2/ItemGuardianApprovalReviewCompletedNotification.d.ts +2 -0
- package/dist/codex/generated/v2/ItemGuardianApprovalReviewStartedNotification.d.ts +2 -0
- package/dist/codex/generated/v2/LoginAccountParams.d.ts +6 -0
- package/dist/codex/generated/v2/ManagedHooksRequirements.d.ts +1 -0
- package/dist/codex/generated/v2/McpServerConnectionStatus.d.ts +1 -0
- package/dist/codex/generated/v2/McpServerConnectionStatus.js +3 -0
- package/dist/codex/generated/v2/McpServerConnectionStatus.js.map +1 -0
- package/dist/codex/generated/v2/McpServerElicitationRequestParams.d.ts +5 -0
- package/dist/codex/generated/v2/McpServerEventNotification.d.ts +5 -0
- package/dist/codex/generated/v2/McpServerEventNotification.js +3 -0
- package/dist/codex/generated/v2/McpServerEventNotification.js.map +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamNotification.d.ts +5 -0
- package/dist/codex/generated/v2/McpServerEventStreamNotification.js +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamNotification.js.map +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartParams.d.ts +9 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartParams.js +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartParams.js.map +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartResponse.d.ts +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamStartResponse.js.map +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopParams.d.ts +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopParams.js +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopParams.js.map +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopResponse.d.ts +1 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js +3 -0
- package/dist/codex/generated/v2/McpServerEventStreamStopResponse.js.map +1 -0
- package/dist/codex/generated/v2/McpServerStatus.d.ts +5 -0
- package/dist/codex/generated/v2/MisalignmentErrorDetails.d.ts +15 -0
- package/dist/codex/generated/v2/MisalignmentErrorDetails.js +3 -0
- package/dist/codex/generated/v2/MisalignmentErrorDetails.js.map +1 -0
- package/dist/codex/generated/v2/MisalignmentSteer.d.ts +3 -0
- package/dist/codex/generated/v2/MisalignmentSteer.js +3 -0
- package/dist/codex/generated/v2/MisalignmentSteer.js.map +1 -0
- package/dist/codex/generated/v2/PluginReconcileChangedPlugin.d.ts +19 -0
- package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js +3 -0
- package/dist/codex/generated/v2/PluginReconcileChangedPlugin.js.map +1 -0
- package/dist/codex/generated/v2/PluginReconcileParams.d.ts +6 -0
- package/dist/codex/generated/v2/PluginReconcileParams.js +3 -0
- package/dist/codex/generated/v2/PluginReconcileParams.js.map +1 -0
- package/dist/codex/generated/v2/PluginReconcileResponse.d.ts +23 -0
- package/dist/codex/generated/v2/PluginReconcileResponse.js +3 -0
- package/dist/codex/generated/v2/PluginReconcileResponse.js.map +1 -0
- package/dist/codex/generated/v2/Project.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectListParams.d.ts +10 -0
- package/dist/codex/generated/v2/ProjectSortKey.d.ts +1 -0
- package/dist/codex/generated/v2/ProjectSortKey.js +3 -0
- package/dist/codex/generated/v2/ProjectSortKey.js.map +1 -0
- package/dist/codex/generated/v2/RawResponseCompletedNotification.d.ts +2 -0
- package/dist/codex/generated/v2/ResponseUsageMetadata.d.ts +8 -0
- package/dist/codex/generated/v2/ResponseUsageMetadata.js +3 -0
- package/dist/codex/generated/v2/ResponseUsageMetadata.js.map +1 -0
- package/dist/codex/generated/v2/SkillMetadata.d.ts +4 -0
- package/dist/codex/generated/v2/SubAgentActivityKind.d.ts +1 -1
- package/dist/codex/generated/v2/Thread.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadForkParams.d.ts +3 -1
- package/dist/codex/generated/v2/ThreadItem.d.ts +9 -0
- package/dist/codex/generated/v2/ThreadReadParams.d.ts +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeBemItemPresentation.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeItem.d.ts +24 -0
- package/dist/codex/generated/v2/ThreadRealtimeItem.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeItem.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.d.ts +8 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemCompletedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.d.ts +8 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemStartedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.d.ts +8 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeItemTranscriptDeltaNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.d.ts +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeSessionOutcome.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeStartTransport.d.ts +6 -0
- package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.d.ts +1 -0
- package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js +3 -0
- package/dist/codex/generated/v2/ThreadRealtimeTranscriptRole.js.map +1 -0
- package/dist/codex/generated/v2/ThreadResumeParams.d.ts +3 -1
- package/dist/codex/generated/v2/ThreadShellCommandParams.d.ts +6 -0
- package/dist/codex/generated/v2/ThreadTimelineEntry.d.ts +31 -0
- package/dist/codex/generated/v2/ThreadTimelineEntry.js +3 -0
- package/dist/codex/generated/v2/ThreadTimelineEntry.js.map +1 -0
- package/dist/codex/generated/v2/ThreadTimelineListParams.d.ts +8 -0
- package/dist/codex/generated/v2/ThreadTimelineListParams.js +3 -0
- package/dist/codex/generated/v2/ThreadTimelineListParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadTimelineListResponse.d.ts +9 -0
- package/dist/codex/generated/v2/ThreadTimelineListResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadTimelineListResponse.js.map +1 -0
- package/dist/codex/generated/v2/TurnError.d.ts +5 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateParams.d.ts +34 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateParams.js +3 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateParams.js.map +1 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateResponse.d.ts +4 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js +3 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateResponse.js.map +1 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateStatus.d.ts +1 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js +3 -0
- package/dist/codex/generated/v2/TurnSettingsUpdateStatus.js.map +1 -0
- package/dist/codex/generated/v2/TurnStartParams.d.ts +19 -0
- package/dist/codex/generated/v2/TurnToolOutput.d.ts +6 -0
- package/dist/codex/generated/v2/TurnToolOutput.js +3 -0
- package/dist/codex/generated/v2/TurnToolOutput.js.map +1 -0
- package/dist/codex/generated/v2/index.d.ts +46 -0
- package/dist/daemon/ownership.js +9 -1
- package/dist/daemon/ownership.js.map +1 -1
- package/dist/daemon/probe.js +1 -1
- package/dist/gateway/clientConnection.js +105 -19
- package/dist/gateway/clientConnection.js.map +1 -1
- package/dist/gateway/optimisticSideThreads.d.ts +11 -5
- package/dist/gateway/optimisticSideThreads.js +103 -47
- package/dist/gateway/optimisticSideThreads.js.map +1 -1
- package/dist/gateway/remoteRelay.js +2 -2
- package/dist/gateway/remoteRelay.js.map +1 -1
- package/dist/gateway/server.js +31 -1
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/stockSideThreads.d.ts +3 -6
- package/dist/gateway/stockSideThreads.js +38 -43
- package/dist/gateway/stockSideThreads.js.map +1 -1
- package/dist/gateway/threadList.d.ts +9 -3
- package/dist/gateway/threadList.js +66 -15
- package/dist/gateway/threadList.js.map +1 -1
- package/dist/gateway/transientNotice.js +4 -4
- package/dist/gateway/transientNotice.js.map +1 -1
- package/dist/handoff/service.d.ts +10 -2
- package/dist/handoff/service.js +164 -106
- package/dist/handoff/service.js.map +1 -1
- package/dist/handoff/store.d.ts +21 -0
- package/dist/handoff/store.js +15 -0
- package/dist/handoff/store.js.map +1 -1
- package/dist/handoff/titleGeneration.d.ts +1 -0
- package/dist/handoff/titleGeneration.js.map +1 -1
- package/dist/management/setup.d.ts +6 -0
- package/dist/management/setup.js +11 -3
- package/dist/management/setup.js.map +1 -1
- package/dist/protocol/search.d.ts +24 -0
- package/dist/protocol/search.js +105 -0
- package/dist/protocol/search.js.map +1 -0
- package/dist/protocol/turnPagination.d.ts +16 -0
- package/dist/protocol/turnPagination.js +75 -35
- package/dist/protocol/turnPagination.js.map +1 -1
- package/dist/runtime/dependencies.js +1 -1
- package/dist/store/HybridStore.d.ts +4 -0
- package/dist/store/HybridStore.js +1 -1
- package/dist/store/HybridStore.js.map +1 -1
- package/dist/store/memoryStore.d.ts +6 -0
- package/dist/store/memoryStore.js +16 -0
- package/dist/store/memoryStore.js.map +1 -1
- package/dist/store/sqliteStore.d.ts +3 -0
- package/dist/store/sqliteStore.js +57 -0
- package/dist/store/sqliteStore.js.map +1 -1
- package/legal/THIRD_PARTY_NOTICES.md +160 -140
- package/package.json +6 -6
- package/scripts/install-claude-stack.sh +27 -4
- package/vendor/codex/continuation.md +5 -0
package/dist/handoff/service.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
424
|
-
? (await stock
|
|
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(
|
|
431
|
-
|
|
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
|
|
446
|
-
|
|
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.
|
|
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(
|
|
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(!
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
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
|
-
:
|
|
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
|
|
1340
|
-
? this.claude.ownsThread(params.threadId) ? "claude" : "stock"
|
|
1341
|
-
: this.
|
|
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,
|
|
1381
|
+
threads.set(threadId, owner);
|
|
1351
1382
|
candidates.set(connectionId, threads);
|
|
1352
1383
|
}
|
|
1353
|
-
observeDurableThread(connectionId, provider) {
|
|
1354
|
-
this.
|
|
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
|
|
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.
|
|
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
|
|
1649
|
+
readStockThread(stock, threadId),
|
|
1602
1650
|
stock.request("thread/resume", { threadId, excludeTurns: true }),
|
|
1603
1651
|
]);
|
|
1604
|
-
resolved = this.epochs.seed(read
|
|
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
|
|
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
|
|
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
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
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
|
|
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.
|
|
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
|
|
1832
|
-
backendTurns: read.
|
|
1833
|
-
turns: await this.visibleTurns(job.publicThreadId, read.
|
|
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
|
|
2169
|
-
return [...overlay.inheritedTurns, ...read.
|
|
2226
|
+
const read = await readStockThread(stock, threadId);
|
|
2227
|
+
return [...overlay.inheritedTurns, ...read.turns];
|
|
2170
2228
|
}
|
|
2171
2229
|
}
|
|
2172
2230
|
//# sourceMappingURL=service.js.map
|