@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.
- 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/modelCatalog.d.ts +4 -0
- package/dist/claude/modelCatalog.js +14 -0
- package/dist/claude/modelCatalog.js.map +1 -1
- package/dist/claude/modelSelection.d.ts +14 -0
- package/dist/claude/modelSelection.js +26 -0
- package/dist/claude/modelSelection.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/resultClassifier.js +4 -1
- package/dist/claude/resultClassifier.js.map +1 -1
- package/dist/claude/service.d.ts +66 -2
- package/dist/claude/service.js +301 -130
- package/dist/claude/service.js.map +1 -1
- package/dist/claude/session/codexRollout.js +40 -1
- package/dist/claude/session/codexRollout.js.map +1 -1
- package/dist/claude/session/commands.d.ts +44 -1
- 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 +13 -2
- 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.js +1 -1
- 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 +171 -49
- 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/claude/toolMapper.js +1 -1
- package/dist/claude/toolMapper.js.map +1 -1
- package/dist/codex/generated/AuthMode.d.ts +1 -1
- package/dist/codex/generated/ClientRequest.d.ts +142 -1
- package/dist/codex/generated/ImageGenerationFailure.d.ts +5 -0
- package/dist/codex/generated/ImageGenerationFailure.js +3 -0
- package/dist/codex/generated/ImageGenerationFailure.js.map +1 -0
- package/dist/codex/generated/ImageGenerationItem.d.ts +3 -0
- package/dist/codex/generated/InitializeCapabilities.d.ts +10 -1
- package/dist/codex/generated/InternalSessionSource.d.ts +1 -1
- package/dist/codex/generated/PathUri.d.ts +4 -3
- package/dist/codex/generated/PlanType.d.ts +1 -1
- package/dist/codex/generated/ResponseItem.d.ts +4 -1
- package/dist/codex/generated/ResponseItemRuntimeSchema.js +2 -2
- package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -1
- package/dist/codex/generated/ReviewDecision.d.ts +1 -1
- package/dist/codex/generated/ServerNotification.d.ts +43 -0
- package/dist/codex/generated/ServerNotificationEnvelope.d.ts +43 -0
- package/dist/codex/generated/index.d.ts +1 -0
- package/dist/codex/generated/index.js.map +1 -1
- package/dist/codex/generated/v2/AccountLoginCompletedNotification.d.ts +2 -0
- package/dist/codex/generated/v2/AgentMessageDelivery.d.ts +1 -0
- package/dist/codex/generated/v2/AgentMessageDelivery.js +3 -0
- package/dist/codex/generated/v2/AgentMessageDelivery.js.map +1 -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/AppsReadParams.d.ts +4 -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/AutoReviewRequirements.d.ts +4 -0
- package/dist/codex/generated/v2/AutoReviewRequirements.js +3 -0
- package/dist/codex/generated/v2/AutoReviewRequirements.js.map +1 -0
- package/dist/codex/generated/v2/AwsCredentialType.d.ts +1 -0
- package/dist/codex/generated/v2/AwsCredentialType.js +3 -0
- package/dist/codex/generated/v2/AwsCredentialType.js.map +1 -0
- package/dist/codex/generated/v2/BedrockAwsProfile.d.ts +4 -0
- package/dist/codex/generated/v2/BedrockAwsProfile.js +3 -0
- package/dist/codex/generated/v2/BedrockAwsProfile.js.map +1 -0
- package/dist/codex/generated/v2/BedrockDiscoverParams.d.ts +1 -0
- package/dist/codex/generated/v2/BedrockDiscoverParams.js +3 -0
- package/dist/codex/generated/v2/BedrockDiscoverParams.js.map +1 -0
- package/dist/codex/generated/v2/BedrockDiscoverResponse.d.ts +6 -0
- package/dist/codex/generated/v2/BedrockDiscoverResponse.js +3 -0
- package/dist/codex/generated/v2/BedrockDiscoverResponse.js.map +1 -0
- package/dist/codex/generated/v2/BedrockEnvironmentCredential.d.ts +5 -0
- package/dist/codex/generated/v2/BedrockEnvironmentCredential.js +3 -0
- package/dist/codex/generated/v2/BedrockEnvironmentCredential.js.map +1 -0
- package/dist/codex/generated/v2/BedrockSetupParams.d.ts +8 -0
- package/dist/codex/generated/v2/BedrockSetupParams.js +3 -0
- package/dist/codex/generated/v2/BedrockSetupParams.js.map +1 -0
- package/dist/codex/generated/v2/BedrockSetupResponse.d.ts +1 -0
- package/dist/codex/generated/v2/BedrockSetupResponse.js +3 -0
- package/dist/codex/generated/v2/BedrockSetupResponse.js.map +1 -0
- 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/CliAuthCredentialsStoreMode.d.ts +1 -0
- package/dist/codex/generated/v2/CliAuthCredentialsStoreMode.js +3 -0
- package/dist/codex/generated/v2/CliAuthCredentialsStoreMode.js.map +1 -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/CommandAction.d.ts +2 -2
- 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/ConfigLayerSource.d.ts +6 -0
- package/dist/codex/generated/v2/ConfigRequirements.d.ts +9 -0
- package/dist/codex/generated/v2/ConfiguredHookHandler.d.ts +10 -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/DesktopOnboardingEntrypoint.d.ts +1 -0
- package/dist/codex/generated/v2/DesktopOnboardingEntrypoint.js +3 -0
- package/dist/codex/generated/v2/DesktopOnboardingEntrypoint.js.map +1 -0
- package/dist/codex/generated/v2/ExternalAgentConfigDetectResponse.d.ts +2 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordParams.d.ts +2 -2
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.d.ts +11 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.js +3 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordSuccessParams.js.map +1 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.d.ts +8 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.js +3 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportHistoryRecordTypeResultParams.js.map +1 -0
- package/dist/codex/generated/v2/ExternalAgentConfigImportItemTypeSuccess.d.ts +4 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.d.ts +6 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.js +3 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorCandidate.js.map +1 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.d.ts +1 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.js +3 -0
- package/dist/codex/generated/v2/ExternalAgentDetectedConnectorSource.js.map +1 -0
- package/dist/codex/generated/v2/GetAccountRateLimitsResponse.d.ts +10 -0
- package/dist/codex/generated/v2/GetAccountTokenUsageParams.d.ts +6 -0
- package/dist/codex/generated/v2/GetAccountTokenUsageParams.js +3 -0
- package/dist/codex/generated/v2/GetAccountTokenUsageParams.js.map +1 -0
- package/dist/codex/generated/v2/GetAccountTokenUsageResponse.d.ts +5 -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/HookHandlerType.d.ts +1 -1
- package/dist/codex/generated/v2/HookMetadata.d.ts +13 -4
- 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/McpAuthStatus.d.ts +1 -1
- package/dist/codex/generated/v2/McpResourceReadParams.d.ts +5 -0
- package/dist/codex/generated/v2/McpResourceReadResponse.d.ts +4 -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/McpServerOauthClientRegistration.d.ts +1 -0
- package/dist/codex/generated/v2/McpServerOauthClientRegistration.js +3 -0
- package/dist/codex/generated/v2/McpServerOauthClientRegistration.js.map +1 -0
- package/dist/codex/generated/v2/McpServerOauthLoginParams.d.ts +5 -0
- package/dist/codex/generated/v2/McpServerStatus.d.ts +6 -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/Model.d.ts +6 -0
- package/dist/codex/generated/v2/ModelUpgradeInfo.d.ts +4 -0
- package/dist/codex/generated/v2/MultiAgentVersion.d.ts +4 -0
- package/dist/codex/generated/v2/MultiAgentVersion.js +3 -0
- package/dist/codex/generated/v2/MultiAgentVersion.js.map +1 -0
- package/dist/codex/generated/v2/PluginDisabledReason.d.ts +1 -0
- package/dist/codex/generated/v2/PluginDisabledReason.js +3 -0
- package/dist/codex/generated/v2/PluginDisabledReason.js.map +1 -0
- package/dist/codex/generated/v2/PluginInstallParams.d.ts +4 -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/PluginSearchParams.d.ts +9 -0
- package/dist/codex/generated/v2/PluginSearchParams.js +3 -0
- package/dist/codex/generated/v2/PluginSearchParams.js.map +1 -0
- package/dist/codex/generated/v2/PluginSearchResponse.d.ts +5 -0
- package/dist/codex/generated/v2/PluginSearchResponse.js +3 -0
- package/dist/codex/generated/v2/PluginSearchResponse.js.map +1 -0
- package/dist/codex/generated/v2/PluginSearchResult.d.ts +7 -0
- package/dist/codex/generated/v2/PluginSearchResult.js +3 -0
- package/dist/codex/generated/v2/PluginSearchResult.js.map +1 -0
- package/dist/codex/generated/v2/PluginSearchScope.d.ts +1 -0
- package/dist/codex/generated/v2/PluginSearchScope.js +3 -0
- package/dist/codex/generated/v2/PluginSearchScope.js.map +1 -0
- package/dist/codex/generated/v2/PluginSummary.d.ts +13 -0
- package/dist/codex/generated/v2/Project.d.ts +16 -0
- package/dist/codex/generated/v2/Project.js +3 -0
- package/dist/codex/generated/v2/Project.js.map +1 -0
- package/dist/codex/generated/v2/ProjectChangeType.d.ts +1 -0
- package/dist/codex/generated/v2/ProjectChangeType.js +3 -0
- package/dist/codex/generated/v2/ProjectChangeType.js.map +1 -0
- package/dist/codex/generated/v2/ProjectChangedNotification.d.ts +5 -0
- package/dist/codex/generated/v2/ProjectChangedNotification.js +3 -0
- package/dist/codex/generated/v2/ProjectChangedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ProjectCreateParams.d.ts +9 -0
- package/dist/codex/generated/v2/ProjectCreateParams.js +3 -0
- package/dist/codex/generated/v2/ProjectCreateParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectCreateResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectCreateResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectCreateResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectDeleteParams.d.ts +3 -0
- package/dist/codex/generated/v2/ProjectDeleteParams.js +3 -0
- package/dist/codex/generated/v2/ProjectDeleteParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectDeleteResponse.d.ts +1 -0
- package/dist/codex/generated/v2/ProjectDeleteResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectDeleteResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectImportParams.d.ts +10 -0
- package/dist/codex/generated/v2/ProjectImportParams.js +3 -0
- package/dist/codex/generated/v2/ProjectImportParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectImportResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectImportResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectImportResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectListParams.d.ts +14 -0
- package/dist/codex/generated/v2/ProjectListParams.js +3 -0
- package/dist/codex/generated/v2/ProjectListParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectListResponse.d.ts +5 -0
- package/dist/codex/generated/v2/ProjectListResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectListResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectMoveParams.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectMoveParams.js +3 -0
- package/dist/codex/generated/v2/ProjectMoveParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectMoveResponse.d.ts +1 -0
- package/dist/codex/generated/v2/ProjectMoveResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectMoveResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectReadParams.d.ts +3 -0
- package/dist/codex/generated/v2/ProjectReadParams.js +3 -0
- package/dist/codex/generated/v2/ProjectReadParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectReadResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectReadResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectReadResponse.js.map +1 -0
- package/dist/codex/generated/v2/ProjectRoot.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectRoot.js +3 -0
- package/dist/codex/generated/v2/ProjectRoot.js.map +1 -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/ProjectUpdateParams.d.ts +9 -0
- package/dist/codex/generated/v2/ProjectUpdateParams.js +3 -0
- package/dist/codex/generated/v2/ProjectUpdateParams.js.map +1 -0
- package/dist/codex/generated/v2/ProjectUpdateResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ProjectUpdateResponse.js +3 -0
- package/dist/codex/generated/v2/ProjectUpdateResponse.js.map +1 -0
- package/dist/codex/generated/v2/QueuedSubmission.d.ts +6 -0
- package/dist/codex/generated/v2/QueuedSubmission.js +3 -0
- package/dist/codex/generated/v2/QueuedSubmission.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/ServerDiagnosticsGauge.d.ts +4 -0
- package/dist/codex/generated/v2/ServerDiagnosticsGauge.js +3 -0
- package/dist/codex/generated/v2/ServerDiagnosticsGauge.js.map +1 -0
- package/dist/codex/generated/v2/ServerDiagnosticsParams.d.ts +1 -0
- package/dist/codex/generated/v2/ServerDiagnosticsParams.js +3 -0
- package/dist/codex/generated/v2/ServerDiagnosticsParams.js.map +1 -0
- package/dist/codex/generated/v2/ServerDiagnosticsProcess.d.ts +5 -0
- package/dist/codex/generated/v2/ServerDiagnosticsProcess.js +3 -0
- package/dist/codex/generated/v2/ServerDiagnosticsProcess.js.map +1 -0
- package/dist/codex/generated/v2/ServerDiagnosticsResponse.d.ts +6 -0
- package/dist/codex/generated/v2/ServerDiagnosticsResponse.js +3 -0
- package/dist/codex/generated/v2/ServerDiagnosticsResponse.js.map +1 -0
- package/dist/codex/generated/v2/SkillMetadata.d.ts +4 -0
- package/dist/codex/generated/v2/StrictReviewRequiredNotification.d.ts +8 -0
- package/dist/codex/generated/v2/StrictReviewRequiredNotification.js +3 -0
- package/dist/codex/generated/v2/StrictReviewRequiredNotification.js.map +1 -0
- package/dist/codex/generated/v2/SubAgentActivityKind.d.ts +1 -1
- package/dist/codex/generated/v2/Thread.d.ts +22 -2
- package/dist/codex/generated/v2/ThreadBackgroundTerminal.d.ts +2 -2
- package/dist/codex/generated/v2/ThreadForkParams.d.ts +3 -1
- package/dist/codex/generated/v2/ThreadItem.d.ts +12 -0
- package/dist/codex/generated/v2/ThreadListParams.d.ts +8 -2
- package/dist/codex/generated/v2/ThreadMetadataUpdateParams.d.ts +5 -4
- package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadProjectUpdatedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueAddParams.d.ts +6 -0
- package/dist/codex/generated/v2/ThreadQueueAddParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueAddParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueAddResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueAddResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueAddResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueChangedNotification.d.ts +3 -0
- package/dist/codex/generated/v2/ThreadQueueChangedNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueChangedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteParams.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteResponse.d.ts +3 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueDeleteResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueListParams.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadQueueListParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueListParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueListResponse.d.ts +8 -0
- package/dist/codex/generated/v2/ThreadQueueListResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueListResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueReorderParams.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueReorderParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueReorderParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueReorderResponse.d.ts +1 -0
- package/dist/codex/generated/v2/ThreadQueueReorderResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueReorderResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueStartParams.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueStartParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueStartParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueStartResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueStartResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueStartResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateParams.d.ts +6 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateParams.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadQueueUpdateResponse.js.map +1 -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/ThreadRealtimeStartParams.d.ts +13 -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/ThreadResumeResponse.d.ts +4 -4
- package/dist/codex/generated/v2/ThreadRevertParams.d.ts +12 -0
- package/dist/codex/generated/v2/ThreadRevertParams.js +3 -0
- package/dist/codex/generated/v2/ThreadRevertParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRevertResponse.d.ts +22 -0
- package/dist/codex/generated/v2/ThreadRevertResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadRevertResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadRevertedNotification.d.ts +3 -0
- package/dist/codex/generated/v2/ThreadRevertedNotification.js +3 -0
- package/dist/codex/generated/v2/ThreadRevertedNotification.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSearchParams.d.ts +2 -2
- package/dist/codex/generated/v2/ThreadSearchSortKey.d.ts +1 -0
- package/dist/codex/generated/v2/ThreadSearchSortKey.js +3 -0
- package/dist/codex/generated/v2/ThreadSearchSortKey.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSection.d.ts +18 -0
- package/dist/codex/generated/v2/ThreadSection.js +3 -0
- package/dist/codex/generated/v2/ThreadSection.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionAppearance.d.ts +7 -0
- package/dist/codex/generated/v2/ThreadSectionAppearance.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionAppearance.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionCreateParams.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadSectionCreateParams.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionCreateParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionCreateResponse.d.ts +7 -0
- package/dist/codex/generated/v2/ThreadSectionCreateResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionCreateResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteParams.d.ts +9 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteParams.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteResponse.d.ts +4 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionDeleteResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionListParams.d.ts +13 -0
- package/dist/codex/generated/v2/ThreadSectionListParams.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionListParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionListResponse.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadSectionListResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionListResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionMoveParams.d.ts +17 -0
- package/dist/codex/generated/v2/ThreadSectionMoveParams.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionMoveParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionMoveResponse.d.ts +1 -0
- package/dist/codex/generated/v2/ThreadSectionMoveResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionMoveResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateParams.d.ts +18 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateParams.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateParams.js.map +1 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateResponse.d.ts +7 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateResponse.js +3 -0
- package/dist/codex/generated/v2/ThreadSectionUpdateResponse.js.map +1 -0
- package/dist/codex/generated/v2/ThreadShellCommandParams.d.ts +6 -0
- package/dist/codex/generated/v2/ThreadSortKey.d.ts +1 -1
- package/dist/codex/generated/v2/ThreadStartParams.d.ts +5 -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/ThreadUsage.d.ts +7 -0
- package/dist/codex/generated/v2/ThreadUsage.js +3 -0
- package/dist/codex/generated/v2/ThreadUsage.js.map +1 -0
- package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.d.ts +11 -0
- package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.js +3 -0
- package/dist/codex/generated/v2/ThreadUsageBreakdownGroup.js.map +1 -0
- package/dist/codex/generated/v2/ToolRequestUserInputParams.d.ts +4 -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 +125 -0
- package/dist/daemon/probe.js +1 -1
- package/dist/gateway/clientConnection.js +129 -24
- package/dist/gateway/clientConnection.js.map +1 -1
- package/dist/gateway/remoteRelay.js +2 -2
- package/dist/gateway/remoteRelay.js.map +1 -1
- package/dist/gateway/stockRpc.d.ts +2 -0
- package/dist/gateway/stockRpc.js +13 -0
- package/dist/gateway/stockRpc.js.map +1 -1
- package/dist/gateway/threadList.d.ts +6 -0
- package/dist/gateway/threadList.js +58 -12
- package/dist/gateway/threadList.js.map +1 -1
- package/dist/gateway/transientNotice.js +6 -4
- package/dist/gateway/transientNotice.js.map +1 -1
- package/dist/handoff/lineageStore.d.ts +2 -8
- package/dist/handoff/lineageStore.js +2 -8
- package/dist/handoff/lineageStore.js.map +1 -1
- package/dist/handoff/providerEpochs.js +4 -5
- package/dist/handoff/providerEpochs.js.map +1 -1
- package/dist/handoff/service.d.ts +16 -3
- package/dist/handoff/service.js +196 -125
- package/dist/handoff/service.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 +60 -1
- package/dist/store/sqliteStore.js.map +1 -1
- package/dist/store/threadFilter.js +11 -2
- package/dist/store/threadFilter.js.map +1 -1
- package/legal/THIRD_PARTY_NOTICES.md +304 -263
- package/package.json +6 -6
- package/scripts/install-claude-stack.sh +27 -4
- package/skills/workforce/SKILL.md +51 -24
- package/vendor/codex/continuation.md +5 -0
package/dist/claude/service.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
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
|
|
422
|
-
if (!
|
|
428
|
+
const lookup = this.cachedCatalogLookup(record.resolvedModel ?? record.claudeModelValue);
|
|
429
|
+
if (!lookup)
|
|
423
430
|
return record;
|
|
424
|
-
const
|
|
425
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1098
|
-
|
|
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
|
|
1113
|
-
|
|
1114
|
-
|
|
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
|
|
1153
|
-
|
|
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
|
|
1199
|
-
await this.
|
|
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,
|
|
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",
|
|
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.
|
|
1285
|
-
|
|
1286
|
-
|
|
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 >
|
|
1330
|
+
if (params.numTurns > source.record.thread.turns.length)
|
|
1292
1331
|
throw invalidParams("Cannot remove more turns than the Claude thread contains.");
|
|
1293
|
-
const
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
const
|
|
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(
|
|
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 (
|
|
1316
|
-
await
|
|
1317
|
-
this.logger.warn("claude.rollback.old-runtime-retire-failed", { threadId
|
|
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
|
|
1321
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1708
|
-
|
|
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,
|
|
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
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
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
|
|
1807
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
1880
|
-
const model =
|
|
1881
|
-
if (!model)
|
|
1882
|
-
throw invalidParams(`Claude model '${
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
:
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
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();
|